1 Firing rate of IL neurons during glycinergic fiber activation

In these experiments glycinergic fibers were photactivated while the firing rate of individual IL neurons was recorded. Some of the IL cells had very low baseline activity. In order to increase the firing rate of the IL neurons and to detect the effect of the glycinergic fiber activation a small tail pinch was applied. The firing rate of the recorded IL cells decreased during the glycinergic fiber activation.

1.1 Loading data

Loading AP and stimuli times from stimulus and from baseline data to IL_stim_firing and to IL_baseline_firing tables:

IL_stim_firing <- CreateRecTibble(AP_times = read_csv(file.path("data", 
    "IL_MFR", "stimulus", "AP_times.csv")), 
    stim_times = read_csv(file.path("data", 
        "IL_MFR", "stimulus", "stim_times.csv")))
IL_stim_firing %>% head()
IL_baseline_firing <- CreateRecTibble(
  AP_times = read_csv(file.path("data", "IL_MFR","baseline", "AP_times.csv")),
  stim_times = read_csv(file.path("data", "IL_MFR","baseline", "stim_times.csv"))
)
IL_stim_firing %>% head()



1.2 Summary information

Summary information of the stimulus and baseline recording files:

  • Variables:
    • file names (file_name)
    • number of channels in the raw recording files (No_ch)
    • number of APs (No_AP_unit, No_AP_unit2)
    • number of stimulus trains (No_Stim)
    • LFP sampling rate (samp_rate_lfp)
    • unit sampling rate (samp_rate_unit)
    • length of the recording (rec_length)
    • length of the stimulus trains (No_trains)
    • Are the lengths of the stimulus trains equal in the recording (train_length_equal)
    • starting time of the stimulus trains (train_start)
    • ending time of the stimulus trains (train_end)



CELL_INFO table to store the cell categories. It was created manually using the information from the summary excel table (Glicy_juxta-fm_exp_records_injection_sum.xls)

  • Variables
    • cell identification (cell_id). To find the recording file use the summary excel table
    • file names (file_name)
    • spontaneously active cells (bl_activity)
    • induced firing (pinch)
    • individually identified neurons (ident)
    • control cells (control)



1.3 Calculations

1.3.1 Firing rates

b_d_a_MFR: Calculating the number of APs -using a custom made function (BDACalculator)- before during and after the stimulus trains (b_d_a_MFR).

b_d_a_MFR <- lapply(CELL_INFO$cell_id, BDACalculator, data = IL_stim_firing) %>% 
  bind_rows() %>%  
  mutate(FR = No_AP / train_length) %>%
  dplyr::group_by(stim_cond, cell_id) %>%
  summarise(MFR = mean(FR))


sd_mean_isi: Calculating the baseline MFR of the recorded IL cells from the IL_baseline_firing table using a custom made function (SDMeanISI). The results are stored in the sd_mean_isi table.


1.3.2 Ranks (strength of inhibition)

cellranks: Calculating ranks based on the activity change from “baseline” to “during stimulus”. If the activity change is negative (decreased MFR) the asigned rank is negative, if it is positive (increased MFR) the assigned rank is positive.


Calculating the firing rate change during stimulus (photoactivation of the glycinergic fibers) compared to baseline:




\[\mathbf{activity\_change} = \frac{during\_MFR - base\_MFR}{base\_MFR} * 100\]

cellranks <- b_d_a_MFR %>% 
  group_by(stim_cond) %>%
  mutate(base_MFR = sd_mean_isi$MFR) %>% 
  mutate(activity_change = ((MFR-base_MFR)/base_MFR*100) %>% round(2)) %>% 
  dplyr::filter(stim_cond == "d") %>% 
  mutate(change_rank = ifelse(activity_change>0, 
                              rank(activity_change), 
                              -rank(-activity_change)) ) %>% 
  ungroup() %>% 
  left_join(CELL_INFO %>% 
              select(cell_id, control, pinch, position),
            by = "cell_id")
cellranks

cellranks_before_stim: Calculating ranks based on the activity change from “before stimulus” to “during stimulus”. If the activity change is negative (decreased MFR) the asigned rank is negative, if it is positive (increased MFR) the assigned rank is positive.


Calculating the firing rate change during stimulus (photoactivation of the glycinergic fibers) compared to before stimulus:




\[\mathbf{activity\_change} = \frac{during\_MFR - before\_MFR}{before\_MFR} * 100\]

cellranks_before_stim <- b_d_a_MFR %>% 
  spread(key = stim_cond,value = MFR) %>% 
  mutate(activity_change = ((d - b)/b*100) %>% round(2)) %>% 
  mutate(change_rank = ifelse(activity_change > 0, 
                              rank(activity_change), 
                              -rank(-activity_change))
         ) %>% 
  left_join(CELL_INFO %>% 
              select(cell_id, control, pinch, position),
            by = "cell_id")
cellranks_before_stim



1.3.3 Data to plot

TO_PLOT: Combining b_d_a_MFR (firing rate of 29 IL neurons b/d/a stim) with sd_mean_isi table (baseline firing rate of the same 29 neurons), joining with CELL_INFO containing important information of the cells (baseline activity, identified, pinched, control) and with cellranks containing the ranks asigned to each cells based on the changes in MFR during the stimulus compared to baseline.

TO_PLOT <- bind_rows(
  sd_mean_isi %>%
    select(MFR, cell_id, stim_cond),
  b_d_a_MFR
) %>% left_join(CELL_INFO %>% 
                  select(-file_name),
                by = "cell_id") %>% 
  left_join(cellranks %>% 
              select(cell_id, change_rank, activity_change), 
            by = "cell_id")

datatable(TO_PLOT,
          caption = "TO_PLOT table",
          rownames = TRUE, 
          options = list(pageLength = 50, scrollX=T, scrollY="500px",dom = 't'))



1.4 Plotting

1.4.1 Baseline vs. “before” stimulus activity

Comparison of baseline and “before” stimulus firing rates in the case of spontaneously active and sponteneously inactive (pinch) neurons. Spontaneously inactive neurons showed significantly higher MFR before stiulus compared to baseline.



1.4.2 MFR before, during and after stimulus



1.4.3 Strength of inhibition

Firing rate change during stimulus (photoactivation of the glycinergic fibers) compared to baseline:



Firing rate change during stimulus (photoactivation of the glycinergic fibers) compared to before stimulus:



Plotting the change in MFR from “baseline” to “during stimulus”. Coloring based on the strength of the inhibition (rank)













2 Activity of PRF glycinergic cells during PFC photoactivation

2.1 Loading and transforming (hidden code) data

source(file.path("supplementary_functions", "CreateRecTibble.R"))
RECORDINGS <- CreateRecTibble(
  AP_times = read_csv(file.path("data", "cortical_stim", "AP_times.csv")),
  stim_times = read_csv(file.path("data", "cortical_stim", "stim_times.csv"))
)

STIM_RESULTS <- read_csv(file.path("output_data", "cortical_stim_analysis.csv"))
Joining, by = c("animal_id", "stim_freq")
  • List of tibbles used to store data:
    • RECORDINGS tibble: stores AP and stim time stamps, number of stimuli in each train, stimulus frequency categories (eg. 8 10 and 12 Hz belong to 10 Hz category)
    • STIM_RESULTS: stores the data for PSTHs
    • hist_stats: stores PSTH statistics calculated from ggplot
    • RESP_PROB: response probability and latency data calculated from stim results and recordings
    • APC: number of APs after each stimulus in a 50 ms window

2.2 Plotting

2.2.1 Distribution of frist APs after cortical activation

2.2.2 PSTH @ 1 Hz cortical activation

2.2.3 PSTH @ 10 Hz cortical activation

2.2.4 PSTH @ 20 Hz cortical activation

2.2.5 Response probability and latency

2.2.6 Number of APs after each stimulus in stimulus trains (50 ms window)

3 Spontaneous desynchronization of the FC slow oscillation

file_to_load <- file_list[[1]]
filename <- as.character(substring(file_to_load, 1, nchar(file_to_load) - 4))
raw.rec <- readMat(file.path("data", file_to_load))

###takes the first AP (first row) and tells the index of point with the max value
points_to_peak <- which(raw.rec$ap[, , 1]$values[1, ] ==
    max(raw.rec$ap[, , 1]$values[1, ])) %>%
    as.numeric()

### time of the peak of the APs after its first point
raw.rec$ap[, , 1]$interval * points_to_peak
        [,1]
[1,] 0.00055
ap <- raw.rec$ap[, , 1]$times %>% as.double()
ap_peaks <- tibble(peak_times = (ap + c(raw.rec$ap[, , 1]$interval * points_to_peak)))

——- insert code here ——–

(spont_desynchron_analysis.R), 7 recordings

4 Terminals

4.1 Loading data

file_path <- file.path("data", 
    "Emi_terminals", "terminal_measures.csv")
TERMINALS <- read.table(file = file_path, 
    sep = ";", header = T, na.string = "na")
head(TERMINALS)
NA

4.2 Bouton area on different dendritic domains

4.3 Area of boutons with m2 and unknown origin

LS0tDQp0aXRsZTogIkZyb250YWwgY29ydGV4LWRyaXZlbiBnbHljaW5lcmdpYyBpbmhpYml0aW9uIG9mIHRoZSBpbnRyYWxhbWluYXIgdGhhbGFtdXMiDQphdXRob3I6ICJWaWt0b3IgUGxhdHRuZXIsIEVtaWxpYSBCb3N6LCBMYXN6bG8gQWNzYWR5Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICBwZGZfZG9jdW1lbnQ6DQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2M6IHllcw0KICAgIGtlZXBfdGV4OiB0cnVlDQogIGh0bWxfbm90ZWJvb2s6DQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQpzcGFjaW5nOiBzaW5nbGUNCmZvbnRzaXplOiAxMnB0DQphbHdheXNfYWxsb3dfaHRtbDogeWVzDQotLS0NCg0KDQoNCg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCg0KYm9keXsgLyogTm9ybWFsICAqLw0KICAgICAgZm9udC1zaXplOiAxNHB4Ow0KICAgICAgZm9udC1mYW1pbHk6ICJBcmlhbCIsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsNCiAgfQ0KdGQgeyAgLyogVGFibGUgICovDQogIGZvbnQtc2l6ZTogMTJweDsNCn0NCmgxLnRpdGxlIHsNCiAgZm9udC1zaXplOiAzOHB4Ow0KICBmb250LWZhbWlseTogIkFyaWFsIiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogIzRkNGU0ZjsNCn0NCmgxIHsgLyogSGVhZGVyIDEgKi8NCiAgZm9udC1zaXplOiAyOHB4Ow0KICBmb250LWZhbWlseTogIkFyaWFsIiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogIzJjM2EzZTsNCn0NCmgyIHsgLyogSGVhZGVyIDIgKi8NCiAgZm9udC1zaXplOiAyMnB4Ow0KICBmb250LWZhbWlseTogIkFyaWFsIiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogIzJjM2EzZTsNCn0NCmgzIHsgLyogSGVhZGVyIDMgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LWZhbWlseTogIkFyaWFsIiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogIzJjM2EzZTsNCn0NCmNvZGUucnsgLyogQ29kZSBibG9jayAqLw0KICAgIGZvbnQtc2l6ZTogMTJweDsNCn0NCnByZSB7IC8qIENvZGUgYmxvY2sgLSBkZXRlcm1pbmVzIGNvZGUgc3BhY2luZyBiZXR3ZWVuIGxpbmVzICovDQogICAgZm9udC1zaXplOiAxNHB4Ow0KfQ0KPC9zdHlsZT4NCg0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KbGlicmFyeShSLm1hdGxhYikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShyZXNoYXBlMikNCmxpYnJhcnkoZ2dyZXBlbCkNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGdncHVicikNCmxpYnJhcnkoc3R5bGVyKQ0KbGlicmFyeShmb3JtYXRSKQ0KDQpsaWJyYXJ5KGJzcGVjKSAjIyMgcG93ZXIgc3BlY3RydW0NCmxpYnJhcnkoV2F2ZWxldENvbXApICMjIyB3YXZlbGV0DQpsaWJyYXJ5KGRpcHRlc3QpICMjIyB0byB0ZXN0IGRpc3RyaWJ1dGlvbiB1bmkvbXVsdGltb2RhbGl0eSAoSVNJKQ0KbGlicmFyeShleGFjdFJhbmtUZXN0cykgIyMjIHdpbGNveC50ZXN0IGZvciB0aWVzDQpsaWJyYXJ5KFdhdmVsZXRDb21wKSAjIyMgd2F2ZWxldA0KbGlicmFyeShzaWduYWwpDQoNCmxpYnJhcnkoU1RBUikNCmxpYnJhcnkoc2VlKSAjZm9yIGhhbGYgdmlvbGlucGxvdA0KbGlicmFyeShnZ2hhbHZlcykgI2ZvciBoYWxmIHZpb2xpbnBsb3QNCg0Kc291cmNlKGZpbGUucGF0aCgic3VwcGxlbWVudGFyeV9mdW5jdGlvbnMiLCAiQ3JlYXRlUmVjVGliYmxlLlIiKSkNCg0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KHRpZHkgPSBUUlVFLCB0aWR5Lm9wdHMgPSBsaXN0KHdpZHRoLmN1dG9mZj0zMCkpDQpgYGANCg0KDQo8YnI+PGJyPg0KDQoNCg0KIyBGaXJpbmcgcmF0ZSBvZiBJTCBuZXVyb25zIGR1cmluZyBnbHljaW5lcmdpYyBmaWJlciBhY3RpdmF0aW9uDQoNCkluIHRoZXNlIGV4cGVyaW1lbnRzIGdseWNpbmVyZ2ljIGZpYmVycyB3ZXJlIHBob3RhY3RpdmF0ZWQgd2hpbGUgdGhlIGZpcmluZyByYXRlIG9mIGluZGl2aWR1YWwgSUwgbmV1cm9ucyB3YXMgcmVjb3JkZWQuIFNvbWUgb2YgdGhlIElMIGNlbGxzIGhhZCB2ZXJ5IGxvdyBiYXNlbGluZSBhY3Rpdml0eS4gSW4gb3JkZXIgdG8gaW5jcmVhc2UgdGhlIGZpcmluZyByYXRlIG9mIHRoZSBJTCBuZXVyb25zIGFuZCB0byBkZXRlY3QgdGhlIGVmZmVjdCBvZiB0aGUgZ2x5Y2luZXJnaWMgZmliZXIgYWN0aXZhdGlvbiBhIHNtYWxsIHRhaWwgcGluY2ggd2FzIGFwcGxpZWQuIFRoZSBmaXJpbmcgcmF0ZSBvZiB0aGUgcmVjb3JkZWQgSUwgY2VsbHMgZGVjcmVhc2VkIGR1cmluZyB0aGUgZ2x5Y2luZXJnaWMgZmliZXIgYWN0aXZhdGlvbi4gDQoNCg0KIyMgTG9hZGluZyBkYXRhDQoNCg0KTG9hZGluZyBBUCBhbmQgc3RpbXVsaSB0aW1lcyBmcm9tICpzdGltdWx1cyogYW5kIGZyb20gKmJhc2VsaW5lKiBkYXRhIHRvICoqSUxfc3RpbV9maXJpbmcqKiBhbmQgdG8gKipJTF9iYXNlbGluZV9maXJpbmcqKiB0YWJsZXM6DQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCB0aWR5PVRSVUV9DQpJTF9zdGltX2ZpcmluZyA8LSBDcmVhdGVSZWNUaWJibGUoICAgIA0KICBBUF90aW1lcyA9IHJlYWRfY3N2KGZpbGUucGF0aCgiZGF0YSIsICJJTF9NRlIiLCAic3RpbXVsdXMiLCAiQVBfdGltZXMuY3N2IikpLCAgDQogIHN0aW1fdGltZXMgPSByZWFkX2NzdihmaWxlLnBhdGgoImRhdGEiLCAiSUxfTUZSIiwic3RpbXVsdXMiLCAic3RpbV90aW1lcy5jc3YiKSkNCikgDQpJTF9zdGltX2ZpcmluZyAlPiUgaGVhZCgpDQpgYGANCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpJTF9iYXNlbGluZV9maXJpbmcgPC0gQ3JlYXRlUmVjVGliYmxlKA0KICBBUF90aW1lcyA9IHJlYWRfY3N2KGZpbGUucGF0aCgiZGF0YSIsICJJTF9NRlIiLCJiYXNlbGluZSIsICJBUF90aW1lcy5jc3YiKSksDQogIHN0aW1fdGltZXMgPSByZWFkX2NzdihmaWxlLnBhdGgoImRhdGEiLCAiSUxfTUZSIiwiYmFzZWxpbmUiLCAic3RpbV90aW1lcy5jc3YiKSkNCikNCklMX3N0aW1fZmlyaW5nICU+JSBoZWFkKCkNCmBgYA0KDQo8YnI+PGJyPg0KDQojIyBTdW1tYXJ5IGluZm9ybWF0aW9uIA0KDQpTdW1tYXJ5IGluZm9ybWF0aW9uIG9mIHRoZSAqc3RpbXVsdXMqIGFuZCAgKmJhc2VsaW5lKiByZWNvcmRpbmcgZmlsZXM6DQoNCiogVmFyaWFibGVzOg0KICArIGZpbGUgbmFtZXMgKCpmaWxlX25hbWUqKQ0KICArIG51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgcmF3IHJlY29yZGluZyBmaWxlcyAoKk5vX2NoKikNCiAgKyBudW1iZXIgb2YgQVBzICgqTm9fQVBfdW5pdCosICpOb19BUF91bml0MiopDQogICsgbnVtYmVyIG9mIHN0aW11bHVzIHRyYWlucyAoKk5vX1N0aW0qKQ0KICArIExGUCBzYW1wbGluZyByYXRlICgqc2FtcF9yYXRlX2xmcCopDQogICsgdW5pdCBzYW1wbGluZyByYXRlICgqc2FtcF9yYXRlX3VuaXQqKQ0KICArIGxlbmd0aCBvZiB0aGUgcmVjb3JkaW5nICgqcmVjX2xlbmd0aCopDQogICsgbGVuZ3RoIG9mIHRoZSBzdGltdWx1cyB0cmFpbnMgKCpOb190cmFpbnMqKQ0KICArIEFyZSB0aGUgbGVuZ3RocyBvZiB0aGUgc3RpbXVsdXMgdHJhaW5zIGVxdWFsIGluIHRoZSByZWNvcmRpbmcgKCp0cmFpbl9sZW5ndGhfZXF1YWwqKQ0KICArIHN0YXJ0aW5nIHRpbWUgb2YgdGhlIHN0aW11bHVzIHRyYWlucyAoKnRyYWluX3N0YXJ0KikNCiAgKyBlbmRpbmcgdGltZSBvZiB0aGUgc3RpbXVsdXMgdHJhaW5zICgqdHJhaW5fZW5kKikNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsZWNobz1GQUxTRSB9DQoNCmluZm9fc3RpbSA8LSByZWFkX2NzdihmaWxlLnBhdGgoImRhdGEiLCAiSUxfTUZSIiwgInN0aW11bHVzIiwgImZpbGVfaW5mby5jc3YiKSkNCmRhdGF0YWJsZShpbmZvX3N0aW0sIA0KICAgICAgICAgIGNhcHRpb24gPSJTdW1tYXJ5IHRhYmxlIG9mIHRoZSBzdGltdWx1cyByZWNvcmRpbmcgZmlsZXMgKGluZm9fc3RpbSkiLCANCiAgICAgICAgICByb3duYW1lcyA9IFRSVUUsIA0KICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSA1MCwgc2Nyb2xsWD1ULCBzY3JvbGxZID0gIjUwMHB4IiwgZG9tID0gJ3QnKSkNCmBgYA0KDQo8YnI+DQoNCmBgYHtyLG1lc3NhZ2U9RkFMU0UsZWNobz1GQUxTRX0NCmluZm9fYmFzZWxpbmUgPC0gcmVhZF9jc3YoZmlsZS5wYXRoKCJkYXRhIiwgIklMX01GUiIsICJiYXNlbGluZSIsImZpbGVfaW5mby5jc3YiKSkNCmRhdGF0YWJsZShpbmZvX2Jhc2VsaW5lLCANCiAgICAgICAgICBjYXB0aW9uID0iU3VtbWFyeSB0YWJsZSBvZiB0aGUgYmFzZWxpbmUgcmVjb3JkaW5nIGZpbGVzIChpbmZvX2Jhc2VsaW5lKSIsDQogICAgICAgICAgcm93bmFtZXMgPSBUUlVFLCANCiAgICAgICAgICBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gNTAsIHNjcm9sbFg9VCwgc2Nyb2xsWT0iNTAwcHgiLGRvbSA9ICd0JykpICANCmBgYA0KPGJyPg0KDQoqKkNFTExfSU5GTyoqIHRhYmxlIHRvIHN0b3JlIHRoZSBjZWxsIGNhdGVnb3JpZXMuIEl0IHdhcyBjcmVhdGVkIG1hbnVhbGx5IHVzaW5nIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzdW1tYXJ5IGV4Y2VsIHRhYmxlICgqR2xpY3lfanV4dGEtZm1fZXhwX3JlY29yZHNfaW5qZWN0aW9uX3N1bS54bHMqKQ0KDQoqIFZhcmlhYmxlcw0KICArIGNlbGwgaWRlbnRpZmljYXRpb24gKCpjZWxsX2lkKikuIFRvIGZpbmQgdGhlIHJlY29yZGluZyBmaWxlIHVzZSB0aGUgc3VtbWFyeSBleGNlbCB0YWJsZQ0KICArIGZpbGUgbmFtZXMgKCpmaWxlX25hbWUqKQ0KICArIHNwb250YW5lb3VzbHkgYWN0aXZlIGNlbGxzICgqYmxfYWN0aXZpdHkqKQ0KICArIGluZHVjZWQgZmlyaW5nICgqcGluY2gqKQ0KICArIGluZGl2aWR1YWxseSBpZGVudGlmaWVkIG5ldXJvbnMgKCppZGVudCopDQogICsgY29udHJvbCBjZWxscyAoKmNvbnRyb2wqKQ0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KIyMjIENFTEwgSU5GTyB0byBzdG9yZSBjYXRlZ29yaWVzIChzcG9udGFuZW91c2x5IGFjdGl2ZSwgaW5kdWNlZCBmaXJpbmcsIGlkZW50aWZpZWQpDQpDRUxMX0lORk8gPC0gaW5mb19iYXNlbGluZSAlPiUNCiAgc2VsZWN0KGZpbGVfbmFtZSkgJT4lDQogIGFkZF9jb2x1bW4oY2VsbF9pZCA9IHN1YnN0cihpbmZvX2Jhc2VsaW5lJGZpbGVfbmFtZSwgMSwgNiksIC5iZWZvcmUgPSAiZmlsZV9uYW1lIikgJT4lDQogIG11dGF0ZShibF9hY3Rpdml0eSA9IFQpICU+JQ0KICBtdXRhdGUoYmxfYWN0aXZpdHkgPSByZXBsYWNlKA0KICAgIGJsX2FjdGl2aXR5LCANCiAgICAuJGNlbGxfaWQgPT0gImNlbGwwNSIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTAiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDEyIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwxMyIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTQiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDE1IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyMSIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjQiLA0KICAgIEYNCiAgKSkgJT4lDQogIG11dGF0ZShwaW5jaCA9IFQpICU+JQ0KICBtdXRhdGUocGluY2ggPSByZXBsYWNlKA0KICAgIHBpbmNoLCANCiAgICAuJGNlbGxfaWQgPT0gImNlbGwwMSIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMDYiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDA3IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwwOCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTgiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDE5IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyMCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjEiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDIzIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyNCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjUiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDI2IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyNyIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjgiLA0KICAgIEYNCiAgKSkgJT4lDQogbXV0YXRlKGlkZW50ID0gVCkgJT4lDQogIG11dGF0ZShpZGVudCA9IHJlcGxhY2UoDQogICAgaWRlbnQsDQogICAgLiRjZWxsX2lkID09ICJjZWxsMDYiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDA3IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwxMSIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTIiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDEzIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwxNCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjEiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDIyIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyMyIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjQiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDI1IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyNiIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjciLA0KICAgIEYNCiAgKSkgJT4lIA0KICBtdXRhdGUoY29udHJvbCA9IEYpICU+JSANCiAgbXV0YXRlKGNvbnRyb2wgPSByZXBsYWNlKA0KICAgIGNvbnRyb2wsDQogICAgLiRjZWxsX2lkID09ICJjZWxsMjUiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDI2IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyNyIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjgiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDI5IiwNCiAgICBUKSkgJT4lIA0KICBtdXRhdGUocG9zaXRpb24gPSAidW5rbm93biIpICU+JQ0KICBtdXRhdGUocG9zaXRpb24gPSByZXBsYWNlKA0KICAgIHBvc2l0aW9uLA0KICAgIC4kY2VsbF9pZCA9PSAiY2VsbDAxIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwwMiIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMDMiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDEwIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwxMSIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTQiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDE1IiwNCiAgICAiSUwiKSkgJT4lDQogIG11dGF0ZShwb3NpdGlvbiA9IHJlcGxhY2UoDQogICAgcG9zaXRpb24sDQogICAgLiRjZWxsX2lkID09ICJjZWxsMjAiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDIxIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyMiIsDQogICAgInRyYW5zaWVudCIpKSAlPiUgDQogIG11dGF0ZShwb3NpdGlvbiA9IHJlcGxhY2UoDQogICAgcG9zaXRpb24sDQogICAgLiRjZWxsX2lkID09ICJjZWxsMDgiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDE2IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwxNyIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjMiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDI0IiwNCiAgICAiUEYiKSkNCg0KZGF0YXRhYmxlKENFTExfSU5GTywgDQogICAgICAgICAgY2FwdGlvbiA9ICJDRUxMX0lORk8gdGFibGUiLA0KICAgICAgICAgIHJvd25hbWVzID0gVFJVRSwgDQogICAgICAgICAgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDUwLCBzY3JvbGxYPVQsIHNjcm9sbFk9IjUwMHB4Iixkb20gPSAndCcpKSAgDQoNCiNJTF9zdGltX2ZpcmluZyRmaWxlX25hbWUgJT4lIHVuaXF1ZSgpICU+JSBsZW5ndGgoKQ0KI2luZm9fc3RpbSRmaWxlX25hbWUgJT4lIGxlbmd0aCgpDQpgYGANCg0KDQo8YnI+PGJyPg0KDQojIyBDYWxjdWxhdGlvbnMNCiMjIyBGaXJpbmcgcmF0ZXMNCg0KYGBge3IsIGluY2x1ZGU9RkFMU0V9DQojIyMgQ0FMQ1VMQVRJTkcgLS0tLS0tLS0NCg0KSUxfc3RpbV9maXJpbmcgPC0gbGVmdF9qb2luKElMX3N0aW1fZmlyaW5nLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX3N0aW0gJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KGZpbGVfbmFtZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNfbGVuZ3RoLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWluX3N0YXJ0cywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpbl9lbmRzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWluX2xlbmd0aCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gImZpbGVfbmFtZSIpDQoNCiMjIyBjYWxjdWxhdGluZyBzdGltIHN0YXJ0IHRpbWVzIA0Kc3RhcnRfdGltZXMgPC0gSUxfc3RpbV9maXJpbmcgJT4lDQogIGdyb3VwX2J5KGZpbGVfbmFtZSkgJT4lDQogIHN1bW1hcmlzZSh0cmFpbl9zdGFydHMgPSB1bmlxdWUodHJhaW5fc3RhcnRzKSwgdHJhaW5fZW5kcyA9IHVuaXF1ZSh0cmFpbl9lbmRzKSkgJT4lDQogIG11dGF0ZShjZWxsX2lkID0gc3Vic3RyKGluZm9fc3RpbSRmaWxlX25hbWUsIDEsIDYpKSAlPiUNCiAgZ3JvdXBfYnkoY2VsbF9pZCkgJT4lDQogIHN1bW1hcmlzZSh0cmFpbl9zdGFydHMgPSB1bmlxdWUodHJhaW5fc3RhcnRzKSkgJT4lDQogIHB1bGwodHJhaW5fc3RhcnRzKSAlPiUNCiAgc3Ryc3BsaXQoIiwiKSAlPiUNCiAgc2V0X25hbWVzKHN1YnN0cihpbmZvX3N0aW0kZmlsZV9uYW1lLCAxLCA2KSkgJT4lDQogIGxhcHBseShhcy5udW1lcmljKQ0KDQojIyMgY2FsY3VsYXRpbmcgc3RpbSBlbmQgdGltZXMgDQplbmRfdGltZXMgPC0gSUxfc3RpbV9maXJpbmcgJT4lDQogIGdyb3VwX2J5KGZpbGVfbmFtZSkgJT4lDQogIHN1bW1hcmlzZSh0cmFpbl9zdGFydHMgPSB1bmlxdWUodHJhaW5fc3RhcnRzKSwgdHJhaW5fZW5kcyA9IHVuaXF1ZSh0cmFpbl9lbmRzKSkgJT4lDQogIG11dGF0ZShjZWxsX2lkID0gc3Vic3RyKGluZm9fc3RpbSRmaWxlX25hbWUsIDEsIDYpKSAlPiUNCiAgZ3JvdXBfYnkoY2VsbF9pZCkgJT4lDQogIHN1bW1hcmlzZSh0cmFpbl9lbmRzID0gdW5pcXVlKHRyYWluX2VuZHMpKSAlPiUNCiAgcHVsbCh0cmFpbl9lbmRzKSAlPiUNCiAgc3Ryc3BsaXQoIiwiKSAlPiUNCiAgc2V0X25hbWVzKHN1YnN0cihpbmZvX3N0aW0kZmlsZV9uYW1lLCAxLCA2KSkgJT4lDQogIGxhcHBseShhcy5udW1lcmljKQ0KDQoNCmNlbGxfbGlzdCA8LSBzdWJzdHIoaW5mb19zdGltJGZpbGVfbmFtZSwgMSwgNikNCkNFTExfSU5GTyRjZWxsX2lkDQpgYGANCg0KYGBge3IsIGluY2x1ZGU9RkFMU0V9DQojIyMgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgQVAgYi9kL2Egc3RpbS4gQXJndW1lbnRzOiBkYXRhIChJTF9zdGltX2ZpcmluZyB0YWJsZSB3aXRoIHJlY19sZW5ndGggYW5kIHN0aW11bHVzIHRyYWluIGluZm9ybWF0aW9uKQ0KQkRBQ2FsY3VsYXRvciA8LSBmdW5jdGlvbihkYXRhLCBsaXN0KSB7DQogIGNlbGxfbGlzdCA8LSBsaXN0DQogIA0KICAgIHRyYWluX2xlbmd0aCA8LSBkYXRhICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihzdWJzdHIoZmlsZV9uYW1lLCAxLCA2KSA9PSBjZWxsX2xpc3QpICU+JQ0KICAgICAgc2VsZWN0KHRyYWluX2xlbmd0aCkgJT4lDQogICAgICBwdWxsKCkgJT4lDQogICAgICBgW1tgKDEpDQogIA0KICANCiAgDQogIGlmICgNCiAgICAoZGF0YSAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoc3Vic3RyKGZpbGVfbmFtZSwgMSwgNikgPT0gY2VsbF9saXN0LCBzaWduYWxfdHlwZSA9PSAiQVAiKSAlPiUNCiAgICAgIHNlbGVjdCh1bml0X2lkKSAlPiUNCiAgICAgIHVuaXF1ZSgpICU+JQ0KICAgICAgcHVsbCgpICU+JQ0KICAgICAgbGVuZ3RoKCkpID09IDENCiAgKSB7DQogICAgIyMjIEluIGNhc2Ugb2Ygb25lIHVuaXQgaW4gdGhlIGZpbGU6DQogICAgQVBfdGltZXMgPC0gZGF0YSAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoc3Vic3RyKGZpbGVfbmFtZSwgMSwgNikgPT0gY2VsbF9saXN0LCBzaWduYWxfdHlwZSA9PSAiQVAiKSAlPiUNCiAgICAgIHNlbGVjdChzaWduYWxfdGltZSkgJT4lDQogICAgICBwdWxsKCkNCiAgICANCiAgICBBUF9udW1iZXJzIDwtIG1hdHJpeCgwLCBucm93ID0gbGVuZ3RoKHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXSksIG5jb2wgPSAzKQ0KICAgIGNvbG5hbWVzKEFQX251bWJlcnMpIDwtIGMoImIiLCAiZCIsICJhIikNCg0KICAgIGZvciAodHJhaW5fbnVtIGluIDE6bGVuZ3RoKHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXSkpIHsNCiAgICAgICMjIyBiZWZvcmUNCiAgICAgIEFQX251bWJlcnNbdHJhaW5fbnVtLCAxXSA8LSBsZW5ndGgoQVBfdGltZXNbc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV0gLSB0cmFpbl9sZW5ndGgNCiAgICAgIDwgQVBfdGltZXMgJiBBUF90aW1lcyA8IHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dXSkNCg0KICAgICAgIyMjIGR1cmluZw0KICAgICAgQVBfbnVtYmVyc1t0cmFpbl9udW0sIDJdIDwtIGxlbmd0aChBUF90aW1lc1tBUF90aW1lcyA+IHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dICYgQVBfdGltZXMgPCBlbmRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV1dKQ0KDQogICAgICAjIyMgYWZ0ZXINCiAgICAgIEFQX251bWJlcnNbdHJhaW5fbnVtLCAzXSA8LSBsZW5ndGgoQVBfdGltZXNbQVBfdGltZXMgPiBlbmRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV0gJg0KICAgICAgICBBUF90aW1lcyA8IGVuZF90aW1lc1tbY2VsbF9saXN0XV1bdHJhaW5fbnVtXSArIHRyYWluX2xlbmd0aF0pDQogICAgfQ0KICAgIA0KICAgIG1lbHQoQVBfbnVtYmVycywgdmFybmFtZXMgPSBjKCJ0cmFpbiIsICJzdGltX2NvbmQiKSwgdmFsdWUubmFtZSA9ICJOb19BUCIpICU+JQ0KICAgICAgYXMudGliYmxlKCkgJT4lDQogICAgICBhZGRfY29sdW1uKGNlbGxfaWQgPSBjZWxsX2xpc3QpICU+JSANCiAgICAgIGFkZF9jb2x1bW4odHJhaW5fbGVuZ3RoID0gdHJhaW5fbGVuZ3RoKQ0KICAgIA0KICAgIA0KICB9IGVsc2UgeyANCiAgICAjIyMgaW4gY2FzZSBvZiBtdWx0aXBsZSB1bml0cyBpbiB0aGUgZmlsZToNCiAgICBBUF90aW1lc18xIDwtIGRhdGEgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKHN1YnN0cihmaWxlX25hbWUsIDEsIDYpID09IGNlbGxfbGlzdCwgc2lnbmFsX3R5cGUgPT0gIkFQIiwgdW5pdF9pZCA9PSAxKSAlPiUNCiAgICAgIHNlbGVjdChzaWduYWxfdGltZSkgJT4lDQogICAgICBwdWxsKCkNCiAgICANCiAgICBBUF9udW1iZXJzXzEgPC0gbWF0cml4KDAsIG5yb3cgPSBsZW5ndGgoc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dKSwgbmNvbCA9IDMpDQogICAgY29sbmFtZXMoQVBfbnVtYmVyc18xKSA8LSBjKCJiIiwgImQiLCAiYSIpDQogICAgDQogICAgZm9yICh0cmFpbl9udW0gaW4gMTpsZW5ndGgoc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dKSkgew0KICAgICAgIyMjIGJlZm9yZQ0KICAgICAgQVBfbnVtYmVyc18xW3RyYWluX251bSwgMV0gPC0gbGVuZ3RoKEFQX3RpbWVzXzFbc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV0gLSB0cmFpbl9sZW5ndGgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCBBUF90aW1lc18xICYgQVBfdGltZXNfMSA8IHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dXSkNCiAgICAgIA0KICAgICAgIyMjIGR1cmluZw0KICAgICAgQVBfbnVtYmVyc18xW3RyYWluX251bSwgMl0gPC0gbGVuZ3RoKEFQX3RpbWVzXzFbQVBfdGltZXNfMSA+IHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dICYgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQX3RpbWVzXzEgPCBlbmRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV1dKQ0KICAgICAgDQogICAgICAjIyMgYWZ0ZXINCiAgICAgIEFQX251bWJlcnNfMVt0cmFpbl9udW0sIDNdIDwtIGxlbmd0aChBUF90aW1lc18xW0FQX3RpbWVzXzEgPiBlbmRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV0gJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUF90aW1lc18xIDwgZW5kX3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dICsgdHJhaW5fbGVuZ3RoXSkNCiAgICB9DQogICAgDQogICAgDQogICAgQVBfdGltZXNfMiA8LSBkYXRhICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihzdWJzdHIoZmlsZV9uYW1lLCAxLCA2KSA9PSBjZWxsX2xpc3QsIHNpZ25hbF90eXBlID09ICJBUCIsIHVuaXRfaWQgPT0gMikgJT4lDQogICAgICBzZWxlY3Qoc2lnbmFsX3RpbWUpICU+JQ0KICAgICAgcHVsbCgpDQogICAgDQogICAgQVBfbnVtYmVyc18yIDwtIG1hdHJpeCgwLCBucm93ID0gbGVuZ3RoKHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXSksIG5jb2wgPSAzKQ0KICAgIGNvbG5hbWVzKEFQX251bWJlcnNfMikgPC0gYygiYiIsICJkIiwgImEiKQ0KICAgIA0KICAgIGZvciAodHJhaW5fbnVtIGluIDE6bGVuZ3RoKHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXSkpIHsNCiAgICAgICMjIyBiZWZvcmUNCiAgICAgIEFQX251bWJlcnNfMlt0cmFpbl9udW0sIDFdIDwtIGxlbmd0aChBUF90aW1lc18yW3N0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dIC0gdHJhaW5fbGVuZ3RoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IEFQX3RpbWVzXzIgJiBBUF90aW1lc18yIDwgc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV1dKQ0KICAgICAgDQogICAgICAjIyMgZHVyaW5nDQogICAgICBBUF9udW1iZXJzXzJbdHJhaW5fbnVtLCAyXSA8LSBsZW5ndGgoQVBfdGltZXNfMltBUF90aW1lc18yID4gc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV0gJiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBfdGltZXNfMiA8IGVuZF90aW1lc1tbY2VsbF9saXN0XV1bdHJhaW5fbnVtXV0pDQogICAgICANCiAgICAgICMjIyBhZnRlcg0KICAgICAgQVBfbnVtYmVyc18yW3RyYWluX251bSwgM10gPC0gbGVuZ3RoKEFQX3RpbWVzXzJbQVBfdGltZXNfMiA+IGVuZF90aW1lc1tbY2VsbF9saXN0XV1bdHJhaW5fbnVtXSAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQX3RpbWVzXzIgPCBlbmRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV0gKyB0cmFpbl9sZW5ndGhdKQ0KICAgIH0NCiAgICANCiAgICANCiAgICANCiAgICBpZiAoY2VsbF9saXN0ICU+JSBzdWJzdHIoNSw2KSAlPiUgYXMubnVtZXJpYygpICU+JSBuY2hhcigpID09IDEpIHsNCiAgICAgIG5ld19uYW1lIDwtIHBhc3RlMCgNCiAgICAgICAgImNlbGwwIiwNCiAgICAgICAgY2VsbF9saXN0ICU+JSBzdWJzdHIoNSw2KSAlPiUgYXMubnVtZXJpYygpICsgMQ0KICAgICAgKQ0KICAgIH0gDQogICAgICANCiAgICBpZiAoY2VsbF9saXN0ICU+JSBzdWJzdHIoNSw2KSAlPiUgYXMubnVtZXJpYygpICU+JSBuY2hhcigpID09IDIpIHsNCiAgICAgIG5ld19uYW1lIDwtIHBhc3RlMCgNCiAgICAgICAgImNlbGwiLA0KICAgICAgICBjZWxsX2xpc3QgJT4lIHN1YnN0cig1LDYpICU+JSBhcy5udW1lcmljKCkgKyAxDQogICAgICApDQogICAgfQ0KICAgIA0KICAgIGJpbmRfcm93cygNCiAgICAgIG1lbHQoQVBfbnVtYmVyc18xLCB2YXJuYW1lcyA9IGMoInRyYWluIiwgInN0aW1fY29uZCIpLCB2YWx1ZS5uYW1lID0gIk5vX0FQIikgJT4lDQogICAgICAgIGFzLnRpYmJsZSgpICU+JQ0KICAgICAgICBhZGRfY29sdW1uKGNlbGxfaWQgPSBjZWxsX2xpc3QpICU+JSANCiAgICAgICAgYWRkX2NvbHVtbih0cmFpbl9sZW5ndGggPSB0cmFpbl9sZW5ndGgpLA0KICAgICAgDQogICAgICBtZWx0KEFQX251bWJlcnNfMiwgdmFybmFtZXMgPSBjKCJ0cmFpbiIsICJzdGltX2NvbmQiKSwgdmFsdWUubmFtZSA9ICJOb19BUCIpICU+JQ0KICAgICAgICBhcy50aWJibGUoKSAlPiUNCiAgICAgICAgYWRkX2NvbHVtbihjZWxsX2lkID0gbmV3X25hbWUpICU+JSANCiAgICAgICAgYWRkX2NvbHVtbih0cmFpbl9sZW5ndGggPSB0cmFpbl9sZW5ndGgpDQogICAgKQ0KICAgfSNlbHNlDQoNCn0jZm9vDQpgYGANCg0KKipiX2RfYV9NRlIqKjogQ2FsY3VsYXRpbmcgdGhlIG51bWJlciBvZiBBUHMgLXVzaW5nIGEgY3VzdG9tIG1hZGUgZnVuY3Rpb24gKCpCREFDYWxjdWxhdG9yKiktIGJlZm9yZSBkdXJpbmcgYW5kIGFmdGVyIHRoZSBzdGltdWx1cyB0cmFpbnMgKCpiX2RfYV9NRlIqKS4gDQoNCmBgYHtyfQ0KYl9kX2FfTUZSIDwtIGxhcHBseShDRUxMX0lORk8kY2VsbF9pZCwgQkRBQ2FsY3VsYXRvciwgZGF0YSA9IElMX3N0aW1fZmlyaW5nKSAlPiUgDQogIGJpbmRfcm93cygpICU+JSAgDQogIG11dGF0ZShGUiA9IE5vX0FQIC8gdHJhaW5fbGVuZ3RoKSAlPiUNCiAgZHBseXI6Omdyb3VwX2J5KHN0aW1fY29uZCwgY2VsbF9pZCkgJT4lDQogIHN1bW1hcmlzZShNRlIgPSBtZWFuKEZSKSkNCmBgYA0KDQo8YnI+DQoqKnNkX21lYW5faXNpKio6IENhbGN1bGF0aW5nIHRoZSBiYXNlbGluZSBNRlIgb2YgdGhlIHJlY29yZGVkIElMIGNlbGxzIGZyb20gdGhlICpJTF9iYXNlbGluZV9maXJpbmcqIHRhYmxlIHVzaW5nIGEgY3VzdG9tIG1hZGUgZnVuY3Rpb24gKCpTRE1lYW5JU0kqKS4gVGhlIHJlc3VsdHMgYXJlIHN0b3JlZCBpbiB0aGUgKnNkX21lYW5faXNpKiB0YWJsZS4NCg0KYGBge3IsIGluY2x1ZGU9RkFMU0V9DQpJTF9iYXNlbGluZV9maXJpbmcgPC0gbGVmdF9qb2luKElMX2Jhc2VsaW5lX2ZpcmluZywNCiAgaW5mb19iYXNlbGluZSAlPiUNCiAgICBzZWxlY3QoZmlsZV9uYW1lLCByZWNfbGVuZ3RoKSwNCiAgYnkgPSAiZmlsZV9uYW1lIg0KKSAlPiUNCiAgbXV0YXRlKHN0aW1fY29uZCA9ICJiYXNlbGluZSIpDQoNCiMjIyBmdW5jdGlvbiB0byBjYWxjdWxhdGUgSVNJIG1lYW4gYW5kIFNEIGR1cmluZyBiYXNlbGluZSBhY3Rpdml0eSBvZiB0aGUgY2VsbHMNClNETWVhbklTSSA8LSBmdW5jdGlvbihmX25hbWUpIHsNCg0KDQogICMgbWVhbl9pc2kgPC0gSUxfYmFzZWxpbmVfZmlyaW5nICU+JQ0KICAjICAgZHBseXI6OmZpbHRlcihmaWxlX25hbWUgPT0gZl9uYW1lLCBzaWduYWxfdHlwZSA9PSAiQVAiKSAlPiUNCiAgIyAgIHNlbGVjdChzaWduYWxfdGltZSkgJT4lDQogICMgICBwdWxsKCkgJT4lDQogICMgICBkaWZmKCkgJT4lDQogICMgICBtZWFuKCkgKiAxMDAwICU+JQ0KICAjICAgYG5hbWVzPC1gKGZfbmFtZSkNCiAgIw0KICAjIHNkX2lzaSA8LSBJTF9iYXNlbGluZV9maXJpbmcgJT4lDQogICMgICBkcGx5cjo6ZmlsdGVyKGZpbGVfbmFtZSA9PSBmX25hbWUsIHNpZ25hbF90eXBlID09ICJBUCIpICU+JQ0KICAjICAgc2VsZWN0KHNpZ25hbF90aW1lKSAlPiUNCiAgIyAgIHB1bGwoKSAlPiUNCiAgIyAgIGRpZmYoKSAlPiUNCiAgIyAgIHNkKCkgKiAxMDAwICU+JQ0KICAjICAgYG5hbWVzPC1gKGZfbmFtZSkNCiAgIw0KICAjIHJldHVybihsaXN0KE1GUiA9IG1lYW5faXNpLA0KICAjICAgICAgICAgICAgIFNERlIgPSBzZF9pc2kpKQ0KDQogIHRtcDIgPC0gSUxfYmFzZWxpbmVfZmlyaW5nICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoZmlsZV9uYW1lID09IGZfbmFtZSwgc2lnbmFsX3R5cGUgPT0gIkFQIikgJT4lDQogICAgc2VsZWN0KHNpZ25hbF90aW1lKSAlPiUNCiAgICBwdWxsKCkgJT4lDQogICAgZGlmZigpICU+JQ0KICAgIG1lYW4oKSAqIDEwMDAgJT4lDQogICAgICB0aWJibGUobWVhbl9pc2kgPSAuKQ0KICB0bXAyICU+JQ0KICAgIG11dGF0ZShzZF9pc2kgPSBJTF9iYXNlbGluZV9maXJpbmcgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGZpbGVfbmFtZSA9PSBmX25hbWUsIHNpZ25hbF90eXBlID09ICJBUCIpICU+JQ0KICAgICAgc2VsZWN0KHNpZ25hbF90aW1lKSAlPiUNCiAgICAgIHB1bGwoKSAlPiUNCiAgICAgIGRpZmYoKSAlPiUNCiAgICAgIHNkKCkgKiAxMDAwKSAlPiUNCiAgICBtdXRhdGUoZmlsZV9uYW1lID0gZl9uYW1lKQ0KfQ0KDQpzZF9tZWFuX2lzaSA8LSBsYXBwbHkoaW5mb19iYXNlbGluZSRmaWxlX25hbWUsIFNETWVhbklTSSkgJT4lIA0KICBiaW5kX3Jvd3MoKSAlPiUgDQogIGFzLnRpYmJsZSgpDQoNCnNkX21lYW5faXNpIDwtIHNkX21lYW5faXNpICU+JQ0KICBtdXRhdGUoY2VsbF9pZCA9IHN1YnN0cihzZF9tZWFuX2lzaSRmaWxlX25hbWUsIDEsIDYpKSAlPiUNCiAgbXV0YXRlKE1GUiA9IDEwMDAgLyBtZWFuX2lzaSkgJT4lDQogIG11dGF0ZShTRF9GUiA9IDEwMDAgLyBzZF9pc2kpICU+JQ0KICBtdXRhdGUoTUZSX2luYyA9IE1GUiArIFNEX0ZSKSAlPiUNCiAgbXV0YXRlKE1GUl9kZWMgPSBNRlIgLSBTRF9GUikgJT4lDQogICMgbXV0YXRlKE1GUl9pbmMgPSAxMDAwLyhtZWFuX2lzaS1zZF9pc2kpKSAlPiUNCiAgIyBtdXRhdGUoTUZSX2RlYyA9IDEwMDAvKG1lYW5faXNpK3NkX2lzaSkpICU+JQ0KICBtdXRhdGUoc3RpbV9jb25kID0gImJhc2VsaW5lIikgJT4lDQogIG11dGF0ZShNRlJfZGVjID0gcmVwbGFjZShNRlJfZGVjLCBzZF9tZWFuX2lzaSRNRlJfZGVjIDwgMCwgMCkpDQpgYGANCjxicj4NCg0KIyMjIFJhbmtzIChzdHJlbmd0aCBvZiBpbmhpYml0aW9uKQ0KKipjZWxscmFua3MqKjogQ2FsY3VsYXRpbmcgcmFua3MgYmFzZWQgb24gdGhlIGFjdGl2aXR5IGNoYW5nZSBmcm9tICIqYmFzZWxpbmUqIiB0byAiKmR1cmluZyBzdGltdWx1cyoiLiBJZiB0aGUgYWN0aXZpdHkgY2hhbmdlIGlzIG5lZ2F0aXZlIChkZWNyZWFzZWQgTUZSKSB0aGUgYXNpZ25lZCByYW5rIGlzIG5lZ2F0aXZlLCBpZiBpdCBpcyBwb3NpdGl2ZSAoaW5jcmVhc2VkIE1GUikgdGhlIGFzc2lnbmVkIHJhbmsgaXMgcG9zaXRpdmUuDQoNCjxicj4NCg0KQ2FsY3VsYXRpbmcgdGhlIGZpcmluZyByYXRlIGNoYW5nZSBkdXJpbmcgc3RpbXVsdXMgKHBob3RvYWN0aXZhdGlvbiBvZiB0aGUgZ2x5Y2luZXJnaWMgZmliZXJzKSBjb21wYXJlZCB0byBiYXNlbGluZToNCg0KPGJyPjxicj48YnI+DQoNCiQkXG1hdGhiZnthY3Rpdml0eVxfY2hhbmdlfSA9IFxmcmFje2R1cmluZ1xfTUZSIC0gYmFzZVxfTUZSfXtiYXNlXF9NRlJ9ICogMTAwJCQNCjxicj4NCg0KYGBge3J9DQpjZWxscmFua3MgPC0gYl9kX2FfTUZSICU+JSANCiAgZ3JvdXBfYnkoc3RpbV9jb25kKSAlPiUNCiAgbXV0YXRlKGJhc2VfTUZSID0gc2RfbWVhbl9pc2kkTUZSKSAlPiUgDQogIG11dGF0ZShhY3Rpdml0eV9jaGFuZ2UgPSAoKE1GUi1iYXNlX01GUikvYmFzZV9NRlIqMTAwKSAlPiUgcm91bmQoMikpICU+JSANCiAgZHBseXI6OmZpbHRlcihzdGltX2NvbmQgPT0gImQiKSAlPiUgDQogIG11dGF0ZShjaGFuZ2VfcmFuayA9IGlmZWxzZShhY3Rpdml0eV9jaGFuZ2U+MCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5rKGFjdGl2aXR5X2NoYW5nZSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXJhbmsoLWFjdGl2aXR5X2NoYW5nZSkpICkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBsZWZ0X2pvaW4oQ0VMTF9JTkZPICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGNlbGxfaWQsIGNvbnRyb2wsIHBpbmNoLCBwb3NpdGlvbiksDQogICAgICAgICAgICBieSA9ICJjZWxsX2lkIikNCmNlbGxyYW5rcw0KYGBgDQoNCg0KDQoqKmNlbGxyYW5rc19iZWZvcmVfc3RpbSoqOiBDYWxjdWxhdGluZyByYW5rcyBiYXNlZCBvbiB0aGUgYWN0aXZpdHkgY2hhbmdlIGZyb20gIipiZWZvcmUgc3RpbXVsdXMqIiB0byAiKmR1cmluZyBzdGltdWx1cyoiLiBJZiB0aGUgYWN0aXZpdHkgY2hhbmdlIGlzIG5lZ2F0aXZlIChkZWNyZWFzZWQgTUZSKSB0aGUgYXNpZ25lZCByYW5rIGlzIG5lZ2F0aXZlLCBpZiBpdCBpcyBwb3NpdGl2ZSAoaW5jcmVhc2VkIE1GUikgdGhlIGFzc2lnbmVkIHJhbmsgaXMgcG9zaXRpdmUuDQoNCjxicj4NCg0KQ2FsY3VsYXRpbmcgdGhlIGZpcmluZyByYXRlIGNoYW5nZSBkdXJpbmcgc3RpbXVsdXMgKHBob3RvYWN0aXZhdGlvbiBvZiB0aGUgZ2x5Y2luZXJnaWMgZmliZXJzKSBjb21wYXJlZCB0byBiZWZvcmUgc3RpbXVsdXM6DQoNCjxicj48YnI+PGJyPg0KDQokJFxtYXRoYmZ7YWN0aXZpdHlcX2NoYW5nZX0gPSBcZnJhY3tkdXJpbmdcX01GUiAtIGJlZm9yZVxfTUZSfXtiZWZvcmVcX01GUn0gKiAxMDAkJA0KPGJyPg0KDQoNCg0KYGBge3J9DQpjZWxscmFua3NfYmVmb3JlX3N0aW0gPC0gYl9kX2FfTUZSICU+JSANCiAgc3ByZWFkKGtleSA9IHN0aW1fY29uZCx2YWx1ZSA9IE1GUikgJT4lIA0KICBtdXRhdGUoYWN0aXZpdHlfY2hhbmdlID0gKChkIC0gYikvYioxMDApICU+JSByb3VuZCgyKSkgJT4lIA0KICBtdXRhdGUoY2hhbmdlX3JhbmsgPSBpZmVsc2UoYWN0aXZpdHlfY2hhbmdlID4gMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5rKGFjdGl2aXR5X2NoYW5nZSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXJhbmsoLWFjdGl2aXR5X2NoYW5nZSkpDQogICAgICAgICApICU+JSANCiAgbGVmdF9qb2luKENFTExfSU5GTyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChjZWxsX2lkLCBjb250cm9sLCBwaW5jaCwgcG9zaXRpb24pLA0KICAgICAgICAgICAgYnkgPSAiY2VsbF9pZCIpDQpjZWxscmFua3NfYmVmb3JlX3N0aW0NCmBgYA0KDQoNCg0KPGJyPjxicj4NCg0KIyMjIERhdGEgdG8gcGxvdA0KKipUT19QTE9UKio6IENvbWJpbmluZyAqYl9kX2FfTUZSKiAoZmlyaW5nIHJhdGUgb2YgMjkgSUwgbmV1cm9ucyBiL2QvYSBzdGltKSB3aXRoICpzZF9tZWFuX2lzaSogdGFibGUgKGJhc2VsaW5lIGZpcmluZyByYXRlIG9mIHRoZSBzYW1lIDI5IG5ldXJvbnMpLCBqb2luaW5nIHdpdGggQ0VMTF9JTkZPIGNvbnRhaW5pbmcgaW1wb3J0YW50IGluZm9ybWF0aW9uIG9mIHRoZSBjZWxscyAoYmFzZWxpbmUgYWN0aXZpdHksIGlkZW50aWZpZWQsIHBpbmNoZWQsIGNvbnRyb2wpIGFuZCB3aXRoICpjZWxscmFua3MqIGNvbnRhaW5pbmcgdGhlIHJhbmtzIGFzaWduZWQgdG8gZWFjaCBjZWxscyBiYXNlZCBvbiB0aGUgY2hhbmdlcyBpbiBNRlIgZHVyaW5nIHRoZSBzdGltdWx1cyBjb21wYXJlZCB0byBiYXNlbGluZS4NCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpUT19QTE9UIDwtIGJpbmRfcm93cygNCiAgc2RfbWVhbl9pc2kgJT4lDQogICAgc2VsZWN0KE1GUiwgY2VsbF9pZCwgc3RpbV9jb25kKSwNCiAgYl9kX2FfTUZSDQopICU+JSBsZWZ0X2pvaW4oQ0VMTF9JTkZPICU+JSANCiAgICAgICAgICAgICAgICAgIHNlbGVjdCgtZmlsZV9uYW1lKSwNCiAgICAgICAgICAgICAgICBieSA9ICJjZWxsX2lkIikgJT4lIA0KICBsZWZ0X2pvaW4oY2VsbHJhbmtzICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGNlbGxfaWQsIGNoYW5nZV9yYW5rLCBhY3Rpdml0eV9jaGFuZ2UpLCANCiAgICAgICAgICAgIGJ5ID0gImNlbGxfaWQiKQ0KDQpkYXRhdGFibGUoVE9fUExPVCwNCiAgICAgICAgICBjYXB0aW9uID0gIlRPX1BMT1QgdGFibGUiLA0KICAgICAgICAgIHJvd25hbWVzID0gVFJVRSwgDQogICAgICAgICAgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDUwLCBzY3JvbGxYPVQsIHNjcm9sbFk9IjUwMHB4Iixkb20gPSAndCcpKQ0KYGBgDQo8YnI+PGJyPg0KDQojIyBQbG90dGluZw0KDQojIyMgQmFzZWxpbmUgdnMuICJiZWZvcmUiIHN0aW11bHVzIGFjdGl2aXR5DQoNCkNvbXBhcmlzb24gb2YgYmFzZWxpbmUgYW5kICJiZWZvcmUiIHN0aW11bHVzIGZpcmluZyByYXRlcyBpbiB0aGUgY2FzZSBvZiBzcG9udGFuZW91c2x5IGFjdGl2ZSBhbmQgc3BvbnRlbmVvdXNseSBpbmFjdGl2ZSAocGluY2gpIG5ldXJvbnMuIFNwb250YW5lb3VzbHkgaW5hY3RpdmUgbmV1cm9ucyBzaG93ZWQgc2lnbmlmaWNhbnRseSBoaWdoZXIgTUZSIGJlZm9yZSBzdGl1bHVzIGNvbXBhcmVkIHRvIGJhc2VsaW5lLg0KDQpgYGB7ciwgZmlnLndpZHRoPTEwLCBlY2hvID0gRkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpnZ3Bsb3QoDQogIGRhdGEgPSBUT19QTE9UICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoDQogICAgICBjb250cm9sID09IEYsDQogICAgICBzdGltX2NvbmQgPT0gImJhc2VsaW5lIiB8IHN0aW1fY29uZCA9PSAiYiINCiAgICApLA0KICBtYXBwaW5nID0gYWVzKA0KICAgIHggPSBmb3JjYXRzOjpmY3RfcmVsZXZlbChzdGltX2NvbmQsICJiYXNlbGluZSIsICJiIiksDQogICAgeSA9IE1GUg0KICApDQopICsNCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4yLCBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3BvaW50KGFlcyhmaWxsID0gcGluY2gpLA0KICAgIHNoYXBlID0gMjEsDQogICAgIyBmaWxsID0gIiNFQjgxMDQiLA0KICAgICMgY29sb3IgPSAid2hpdGUiLA0KICAgIHNpemUgPSA0DQogICkgKw0KICAjIHN0cm9rZSA9IDIpICsNCiAgZ2VvbV9saW5lKA0KICAgIGFlcyhncm91cCA9IGNlbGxfaWQsIGNvbCA9IHBpbmNoKQ0KICApICsNCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gMCkpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCksDQogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApDQogICkgKw0KICB4bGFiKCJSZWNvcmRpbmcgcGVyaW9kIikgKw0KICBmYWNldF93cmFwKHZhcnMocGluY2gpKSArDQogIHN0YXRfY29tcGFyZV9tZWFucyhtZXRob2QgPSAid2lsY294LnRlc3QiLCBwYWlyZWQgPSBUKSArDQogICBnZW9tX2xhYmVsX3JlcGVsKA0KICAgIGRhdGEgPSBUT19QTE9UICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcigNCiAgICAgICAgY29udHJvbCA9PSBGLA0KICAgICAgICBzdGltX2NvbmQgPT0gImJhc2VsaW5lIg0KICAgICAgKSwNCiAgICBtYXBwaW5nID0gYWVzKGxhYmVsID0gY2VsbF9pZCksDQogICAgbnVkZ2VfeCA9IC0uOSwNCiAgICBkaXJlY3Rpb24gPSAieSIsDQogICAgIyBoanVzdCA9IDIsDQogICAgc2VnbWVudC5zaXplID0gLjINCiAgKQ0KIA0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyBNRlIgYmVmb3JlLCBkdXJpbmcgYW5kIGFmdGVyIHN0aW11bHVzIA0KDQpgYGB7ciwgZmlnLndpZHRoPTE0LCBmaWcuaGVpZ2h0PTEyICxlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ2dwbG90KA0KICBkYXRhID0gVE9fUExPVCAlPiUNCiAgICBkcGx5cjo6ZmlsdGVyKA0KICAgICAgY29udHJvbCA9PSBGLA0KICAgICAgc3RpbV9jb25kID09ICJiIiB8IHN0aW1fY29uZCA9PSAiZCIgfCBzdGltX2NvbmQgPT0gImEiDQogICAgKSwNCiAgbWFwcGluZyA9IGFlcygNCiAgICB4ID0gZm9yY2F0czo6ZmN0X3JlbGV2ZWwoc3RpbV9jb25kLCAiYiIsICJkIiwgImEiKSwNCiAgICB5ID0gTUZSDQogICkNCikgKw0KICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAwKSkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwNCiAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCkNCiAgKSArDQogIGdndGl0bGUoIlBpbmNoIiwpICsgDQogIHhsYWIoIlJlY29yZGluZyBwZXJpb2QiKSArDQogIHlsaW0oMCwgMzUpICsNCg0KICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjIsIGFscGhhID0gMC41KSArDQogIGdlb21fcG9pbnQoDQogICAgc2hhcGUgPSAyMSwNCiAgICBmaWxsID0gIiNFQjgxMDQiLA0KICAgICNjb2xvciA9ICJ3aGl0ZSIsDQogICAgc2l6ZSA9IDQNCiAgKSArDQogICMgc3Ryb2tlID0gMikgKw0KICBnZW9tX2xpbmUoDQogICAgYWVzKGdyb3VwID0gY2VsbF9pZCksIA0KICAgIGNvbG9yID0gIiNFQjgxMDQiDQogICkgKw0KICBnZW9tX2xhYmVsX3JlcGVsKA0KICAgIGRhdGEgPSAgVE9fUExPVCAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoDQogICAgICAgIGNvbnRyb2wgPT0gRiwNCiAgICAgICAgc3RpbV9jb25kID09ICJhIg0KICAgICAgKSwNCiAgICBtYXBwaW5nID0gYWVzKGxhYmVsID0gY2VsbF9pZCksDQogICAgbnVkZ2VfeCA9IDAuMTUsDQogICAgZGlyZWN0aW9uID0gInkiLA0KICAgIGhqdXN0ID0gLTAuNSwNCiAgICBzZWdtZW50LnNpemUgPSAuMg0KICApICsNCiAgZmFjZXRfd3JhcCh2YXJzKHBpbmNoKSkNCmBgYA0KPGJyPjxicj4NCg0KIyMjIFN0cmVuZ3RoIG9mIGluaGliaXRpb24NCg0KRmlyaW5nIHJhdGUgY2hhbmdlICoqZHVyaW5nKiogc3RpbXVsdXMgKHBob3RvYWN0aXZhdGlvbiBvZiB0aGUgZ2x5Y2luZXJnaWMgZmliZXJzKSBjb21wYXJlZCB0byAqKmJhc2VsaW5lKio6DQoNCmBgYHtyLCBmaWcud2lkdGg9MTAsIGVjaG89RkFMU0Usd2FybmluZz1GQUxTRX0NCmdncGxvdChkYXRhID0gY2VsbHJhbmtzLA0KICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IGNoYW5nZV9yYW5rLCB5ID0gYWN0aXZpdHlfY2hhbmdlKSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBjZWxscmFua3MgJT4lIA0KICAgICAgICAgICAgICAgZHBseXI6OmZpbHRlcihjb250cm9sID09IEYpLHNpemUgPSAzKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGNlbGxyYW5rcyAlPiUgDQogICAgICAgICAgICAgICBkcGx5cjo6ZmlsdGVyKGNvbnRyb2wgPT0gVCksIHNpemUgPSAzLCBjb2wgPSAibWFnZW50YSIpICsNCiAgIyMjIGxhYmVsIGZvciBuZWdhdGl2ZSB2YWx1ZXMNCiAgZ2VvbV90ZXh0X3JlcGVsKGRhdGEgPSBjZWxscmFua3MgJT4lIA0KICAgICAgICAgICAgICAgICAgICBkcGx5cjo6ZmlsdGVyKGFjdGl2aXR5X2NoYW5nZSA8IDApLA0KICAgIGFlcyhsYWJlbCA9IGNlbGxfaWQpLA0KICAgIGRpcmVjdGlvbiA9ICJ5IiwNCiAgICBhbmdsZSA9IDkwLA0KICAgIGhqdXN0ID0gLjUsDQogICAgbnVkZ2VfeSA9IC0yDQogICAgKSArDQogIA0KICAjIyMgbGFiZWwgZm9yIHBvc2l0aXZlIHZhbHVlcw0KICBnZW9tX3RleHRfcmVwZWwoZGF0YSA9IGNlbGxyYW5rcyAlPiUgDQogICAgICAgICAgICAgICAgICAgIGRwbHlyOjpmaWx0ZXIoYWN0aXZpdHlfY2hhbmdlID4gMCksDQogICAgYWVzKGxhYmVsID0gY2VsbF9pZCksDQogICAgZGlyZWN0aW9uID0gIngiLA0KICAgIGFuZ2xlID0gMCwNCiAgICBoanVzdCA9IC41LA0KICAgIG51ZGdlX3ggPSAtMQ0KICAgICkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2wgPSAiZ3JleSIsIGx0eSA9ICJkYXNoZWQiKSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDI3LCB5ID0gLTE3LCBsYWJlbCA9ICJCYXNlbGluZSBhY3Rpdml0eSIsIGNvbCA9ICJncmF5IikgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBjb2wgPSAiZ3JleSIsIGx0eSA9ICJkYXNoZWQiKSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IC0yLCB5ID0gMjgwLCBsYWJlbCA9ICJOZWdhdGl2ZSByYW5rOiBGUiBkZWNyZWFzZSIsIGNvbCA9ICJncmF5IiwgYW5nbGUgPSA5MCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSAyLCB5ID0gMjgwLCBsYWJlbCA9ICJQb3NpdGl2ZSByYW5rOiBGUiBpbmNyZWFzZSIsIGNvbCA9ICJncmF5IiwgYW5nbGUgPSA5MCkgKw0KICB0aGVtZV9taW5pbWFsKCkgKyANCiAgdGhlbWUoDQogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCksDQogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApDQogICkgKw0KICB5bGltKC1tYXgoY2VsbHJhbmtzJGFjdGl2aXR5X2NoYW5nZSksbWF4KGNlbGxyYW5rcyRhY3Rpdml0eV9jaGFuZ2UpKQ0KDQpgYGANCg0KPGJyPjxicj4NCg0KRmlyaW5nIHJhdGUgY2hhbmdlICoqZHVyaW5nKiogc3RpbXVsdXMgKHBob3RvYWN0aXZhdGlvbiBvZiB0aGUgZ2x5Y2luZXJnaWMgZmliZXJzKSBjb21wYXJlZCB0byAqKmJlZm9yZSoqIHN0aW11bHVzOg0KDQpgYGB7ciwgZmlnLndpZHRoPTEwLCBlY2hvPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQoNCmdncGxvdChkYXRhID0gY2VsbHJhbmtzX2JlZm9yZV9zdGltLA0KICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IGNoYW5nZV9yYW5rLCB5ID0gYWN0aXZpdHlfY2hhbmdlKSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBjZWxscmFua3NfYmVmb3JlX3N0aW0gJT4lIA0KICAgICAgICAgICAgICAgZHBseXI6OmZpbHRlcihjb250cm9sID09IEYpLHNpemUgPSA2LA0KICAgICAgICAgICAgIGFlcyhjb2wgPSBwb3NpdGlvbiwNCiAgICAgICAgICAgICAgICAgc2hhcGUgPSBwaW5jaCkNCiAgICAgICAgICAgICApICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIklMIiA9ICJncmVlbiIsICJ0cmFuc2llbnQiID0gImJsdWUiLCAiUEYiID0gInJlZCIsICJ1bmtub3duIiA9ICJibGFjayIsICJjb250cm9sIiA9ICJtYWdlbnRhIikpICsgDQogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKCJUUlVFIiA9ICIrIiwgIkZBTFNFIiA9ICItIikpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gY2VsbHJhbmtzX2JlZm9yZV9zdGltICU+JQ0KICAgICAgICAgICAgICAgZHBseXI6OmZpbHRlcihjb250cm9sID09IFQpLCBzaXplID0gMywgY29sID0gIm1hZ2VudGEiKSArDQogICMjIyBsYWJlbCBmb3IgbmVnYXRpdmUgdmFsdWVzDQogIGdlb21fdGV4dF9yZXBlbChkYXRhID0gY2VsbHJhbmtzX2JlZm9yZV9zdGltICU+JSANCiAgICAgICAgICAgICAgICAgICAgZHBseXI6OmZpbHRlcihhY3Rpdml0eV9jaGFuZ2UgPCAwKSwNCiAgICBhZXMobGFiZWwgPSBjZWxsX2lkKSwNCiAgICBkaXJlY3Rpb24gPSAieSIsDQogICAgYW5nbGUgPSA5MCwNCiAgICBoanVzdCA9IC41LA0KICAgIG51ZGdlX3kgPSAtMg0KICAgICkgKw0KICANCiAgIyMjIGxhYmVsIGZvciBwb3NpdGl2ZSB2YWx1ZXMNCiAgZ2VvbV90ZXh0X3JlcGVsKGRhdGEgPSBjZWxscmFua3NfYmVmb3JlX3N0aW0gJT4lIA0KICAgICAgICAgICAgICAgICAgICBkcGx5cjo6ZmlsdGVyKGFjdGl2aXR5X2NoYW5nZSA+IDApLA0KICAgIGFlcyhsYWJlbCA9IGNlbGxfaWQpLA0KICAgIGRpcmVjdGlvbiA9ICJ4IiwNCiAgICBhbmdsZSA9IDAsDQogICAgaGp1c3QgPSAuNSwNCiAgICBudWRnZV94ID0gLTENCiAgICApICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sID0gImdyZXkiLCBsdHkgPSAiZGFzaGVkIikgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSAyNywgeSA9IC0xNywgbGFiZWwgPSAiQmFzZWxpbmUgYWN0aXZpdHkiLCBjb2wgPSAiZ3JheSIpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgY29sID0gImdyZXkiLCBsdHkgPSAiZGFzaGVkIikgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSAtMiwgeSA9IDI4MCwgbGFiZWwgPSAiTmVnYXRpdmUgcmFuazogRlIgZGVjcmVhc2UiLCBjb2wgPSAiZ3JheSIsIGFuZ2xlID0gOTApICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMiwgeSA9IDI4MCwgbGFiZWwgPSAiUG9zaXRpdmUgcmFuazogRlIgaW5jcmVhc2UiLCBjb2wgPSAiZ3JheSIsIGFuZ2xlID0gOTApICsNCiAgdGhlbWVfbWluaW1hbCgpICsgDQogIHRoZW1lKA0KICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApLA0KICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKQ0KICApICsNCiAgeGxhYigiUmFua3MiKSArDQogIHlsYWIoIkNoYW5nZSBpbiBmaXJpbmcgcmF0ZSBbJV0iKSArDQogIHlsaW0oLW1heChjZWxscmFua3NfYmVmb3JlX3N0aW0kYWN0aXZpdHlfY2hhbmdlKSxtYXgoY2VsbHJhbmtzX2JlZm9yZV9zdGltJGFjdGl2aXR5X2NoYW5nZSkpIA0KDQoNCmBgYA0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KPGJyPjxicj4NCg0KUGxvdHRpbmcgdGhlIGNoYW5nZSBpbiBNRlIgZnJvbSAiKmJhc2VsaW5lKiIgdG8gIipkdXJpbmcgc3RpbXVsdXMqIi4gQ29sb3JpbmcgYmFzZWQgb24gdGhlIHN0cmVuZ3RoIG9mIHRoZSBpbmhpYml0aW9uICgqcmFuayopDQoNCmBgYHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9MTIsIGVjaG89RkFMU0Usd2FybmluZz1GQUxTRX0NCmdncGxvdCgNCiAgZGF0YSA9IFRPX1BMT1QgJT4lDQogICAgZHBseXI6OmZpbHRlcigNCiAgICAgIGNvbnRyb2wgPT0gRiwNCiAgICAgIHN0aW1fY29uZCA9PSAiYmFzZWxpbmUiIHwgc3RpbV9jb25kID09ICJkIg0KICAgICksDQogIG1hcHBpbmcgPSBhZXMoDQogICAgeCA9IGZvcmNhdHM6OmZjdF9yZWxldmVsKHN0aW1fY29uZCwgImJhc2VsaW5lIiwgImQiLCAiYSIpLA0KICAgIHkgPSBNRlINCiAgKQ0KKSArDQogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMiwgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IGNoYW5nZV9yYW5rKSwNCiAgICBzaGFwZSA9IDIxLA0KICAgICMgZmlsbCA9ICIjRUI4MTA0IiwNCiAgICAjIGNvbG9yID0gIndoaXRlIiwNCiAgICBzaXplID0gNA0KICApICsNCiAgIyBzdHJva2UgPSAyKSArDQogIGdlb21fbGluZSgNCiAgICBhZXMoZ3JvdXAgPSBjZWxsX2lkLCBjb2wgPSBjaGFuZ2VfcmFuaykNCiAgKSArDQogIGdlb21fbGFiZWxfcmVwZWwoDQogICAgZGF0YSA9IFRPX1BMT1QgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKA0KICAgICAgICBjb250cm9sID09IEYsDQogICAgICAgIHN0aW1fY29uZCA9PSAiYmFzZWxpbmUiDQogICAgICApLA0KICAgIG1hcHBpbmcgPSBhZXMobGFiZWwgPSBjZWxsX2lkLCBjb2wgPSBjaGFuZ2VfcmFuayksDQogICAgI251ZGdlX3ggPSAtLjEsDQogICAgZGlyZWN0aW9uID0gInkiLA0KICAgIGhqdXN0ID0gNCwNCiAgICBzZWdtZW50LnNpemUgPSAuMg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCksDQogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApDQogICkgKw0KICB4bGFiKCJSZWNvcmRpbmcgcGVyaW9kIikgKw0KICBsYWJzKGZpbGwgPSAiUmFuayIgLGNvbCA9ICJSYW5rIikNCg0KYGBgDQoNCg0KPGJyPjxicj48YnI+PGJyPjxicj48YnI+PGJyPjxicj48YnI+PGJyPjxicj48YnI+DQoNCg0KIyBBY3Rpdml0eSBvZiBQUkYgZ2x5Y2luZXJnaWMgY2VsbHMgZHVyaW5nIFBGQyBwaG90b2FjdGl2YXRpb24NCg0KIyMgTG9hZGluZyBhbmQgdHJhbnNmb3JtaW5nIChoaWRkZW4gY29kZSkgZGF0YQ0KDQoNCmBgYHtyIGxvYWRpbmcgZGF0YSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnNvdXJjZShmaWxlLnBhdGgoInN1cHBsZW1lbnRhcnlfZnVuY3Rpb25zIiwgIkNyZWF0ZVJlY1RpYmJsZS5SIikpDQpSRUNPUkRJTkdTIDwtIENyZWF0ZVJlY1RpYmJsZSgNCiAgQVBfdGltZXMgPSByZWFkX2NzdihmaWxlLnBhdGgoImRhdGEiLCAiY29ydGljYWxfc3RpbSIsICJBUF90aW1lcy5jc3YiKSksDQogIHN0aW1fdGltZXMgPSByZWFkX2NzdihmaWxlLnBhdGgoImRhdGEiLCAiY29ydGljYWxfc3RpbSIsICJzdGltX3RpbWVzLmNzdiIpKQ0KKQ0KDQpTVElNX1JFU1VMVFMgPC0gcmVhZF9jc3YoZmlsZS5wYXRoKCJvdXRwdXRfZGF0YSIsICJjb3J0aWNhbF9zdGltX2FuYWx5c2lzLmNzdiIpKQ0KYGBgDQoNCg0KYGBge3IgdHJhbnNmb3JtaW5nIGRhdGEsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIyMgYWRkaW5nIHN0aW11bHVzIG51bWJlciB3aXRoaW4gdHJhaW4NClJFQ09SRElOR1MgPC0gUkVDT1JESU5HUyAlPiUNCiAgbXV0YXRlKHN0aW1fbnVtYmVyID0gMCkNCg0KIyMjIGNhbGN1bGF0aW5nIHN0aW11bHVzIG51bWJlciB3aXRoaW4gdHJhaW4gDQppbml0aWFsX3ZhbHVlIDwtIFJFQ09SRElOR1Mkc3RpbV9mcmVxWzFdICU+JSANCiAgYGNvbW1lbnQ8LWAoIkZpcnN0IHZhbHVlIG9mIHN0aW1fZnJlcSB2YXJpYWJsZS4gV2hlbiBpdCBjaGFuZ2VzIHN0aW11bHVzIGNvdW50aW5nIHJlc3RhcnRzIikNCg0Kc3RpbV9jb3VudGVyIDwtIDEgJT4lIA0KICBgY29tbWVudDwtYCgiQ291bnRzIHN0aW11bGkgaW4gYSB0cmFpbiIpDQppbmRleCA8LSAxICU+JSANCiAgYGNvbW1lbnQ8LWAoIlRyYWNrcyB0aGUgcG9zaXRpb24gKGluZGV4KSBvZiBzdGltX2ZyZXEiKQ0KDQpSRUNPUkRJTkdTJHN0aW1fbnVtYmVyWzFdIDwtIHN0aW1fY291bnRlcg0KcmVwZWF0ew0KICBpZiAoUkVDT1JESU5HUyRzdGltX2ZyZXFbaW5kZXggKyAxXSA9PSBpbml0aWFsX3ZhbHVlKSB7DQogICAgUkVDT1JESU5HUyRzdGltX251bWJlcltpbmRleCArIDFdIDwtIHN0aW1fY291bnRlciArIDENCiAgICBzdGltX2NvdW50ZXIgPC0gc3RpbV9jb3VudGVyICsgMQ0KICAgIGluZGV4IDwtIGluZGV4ICsgMQ0KICB9IGVsc2Ugew0KICAgIGluaXRpYWxfdmFsdWUgPC0gUkVDT1JESU5HUyRzdGltX2ZyZXFbaW5kZXggKyAxXQ0KICAgIHN0aW1fY291bnRlciA8LSAxDQogICAgUkVDT1JESU5HUyRzdGltX251bWJlcltpbmRleCArIDFdIDwtIHN0aW1fY291bnRlcg0KICAgIGluZGV4IDwtIGluZGV4ICsgMQ0KICB9DQogIA0KICBpZiAoaW5kZXggPT0gbGVuZ3RoKFJFQ09SRElOR1Mkc3RpbV9udW1iZXIpKSB7DQogICAgYnJlYWsNCiAgfQ0KfQ0KDQojIyMgcmVwbGFjaW5nIHN0aW1fbnVtYmVyIHdpdGggTkEgYXQgIkFQIg0KUkVDT1JESU5HUyRzdGltX251bWJlcltSRUNPUkRJTkdTJHNpZ25hbF90eXBlID09ICJBUCJdIDwtIE5BDQoNCiMjIyBjYXRlZ29yaXppbmcgc3RpbXVsaQ0KUkVDT1JESU5HUyA8LSBSRUNPUkRJTkdTICU+JQ0KICBtdXRhdGUoc3RpbV9mcmVxX2NhdGVnID0gc3RpbV9mcmVxKSAlPiUNCiAgbXV0YXRlKHN0aW1fZnJlcV9jYXRlZyA9IHJlcGxhY2UoDQogICAgeCA9IHN0aW1fZnJlcV9jYXRlZywNCiAgICBsaXN0ID0gKHN0aW1fZnJlcV9jYXRlZyA9PSAxMiB8IHN0aW1fZnJlcV9jYXRlZyA9PSA4KSwNCiAgICB2YWx1ZXMgPSAxMA0KICApKSAlPiUNCiAgbXV0YXRlKHN0aW1fZnJlcV9jYXRlZyA9IHJlcGxhY2UoDQogICAgeCA9IHN0aW1fZnJlcV9jYXRlZywNCiAgICBsaXN0ID0gKHN0aW1fZnJlcV9jYXRlZyA9PSAxOCksDQogICAgdmFsdWVzID0gMjANCiAgKSkNCg0KYGBgDQoNCmBgYHtyIGNhbGN1bGF0aW5nIGhpc3Qgc3RhdHMsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpzb3VyY2UoZmlsZS5wYXRoKCJzdXBwbGVtZW50YXJ5X2Z1bmN0aW9ucyIsICJIaXN0U3RhdHMuUiIpKQ0KDQpTVElNX1JFU1VMVFMgJT4lDQogIGRwbHlyOjpncm91cF9ieShmcmVxKSAlPiUNCiAgc3VtbWFyaXNlKG5fdGltZXMgPSBsZW5ndGgodW5pcXVlKGFuaW1hbF9pZCkpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBhcy5tYXRyaXgoKSAlPiUNCiAgdW5uYW1lKCkgLT4gcmVwX21hdHJpeA0KDQojIyMgc2V0IFBTVEggcmFuZ2UNClBTVEhfcmFuZ2UgPC0gYygtMC4wMSwgMC4wNCkNCg0KDQpoaXN0X3N0YXRzIDwtIFNUSU1fUkVTVUxUUyAlPiUNCiAgZHBseXI6OmZpbHRlcigNCiAgICBmaXJzdF9hcF9yZWx0aW1lcyA+IFBTVEhfcmFuZ2VbMV0sDQogICAgZmlyc3RfYXBfcmVsdGltZXMgPCBQU1RIX3JhbmdlWzJdDQogICkgJT4lDQogIGRwbHlyOjpncm91cF9ieShmcmVxKSAlPiUNCiAgZG8oZ3BfaGlzdCA9IGdncGxvdCgNCiAgICBkYXRhID0gLiwNCiAgICBtYXBwaW5nID0gYWVzKHggPSBmaXJzdF9hcF9yZWx0aW1lcykNCiAgKSArDQogICAgeGxpbShQU1RIX3JhbmdlWzFdLCBQU1RIX3JhbmdlWzJdKSArDQogICAgZ2VvbV9oaXN0b2dyYW0oYWVzKGZpbGwgPSBhbmltYWxfaWQpLCBiaW53aWR0aCA9IDAuMDAxKSArDQogICAgc2NhbGVfZmlsbF9icmV3ZXIoDQogICAgICBwYWxldHRlID0gIlNldDMiLA0KICAgICAgbmFtZSA9ICJBbmltYWwiDQogICAgICAjIGd1aWRlID0gRkFMU0UNCiAgICApICsNCiAgICBmYWNldF93cmFwKH5hbmltYWxfaWQsIG5jb2wgPSAzKSArDQogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKw0KICAgIHhsYWIoIlRpbWUgKHMpIikgKw0KICAgIHlsYWIoIkNvdW50IikgKw0KICAgIGdndGl0bGUocGFzdGUwKC4kZnJlcSwgIiBIeiIpKSkgJT4lDQogIGBbW2AoMikgJT4lDQogIGxhcHBseSguICU+JSBIaXN0U3RhdHMoKSAlPiUgYXMudGliYmxlKCkpICU+JQ0KICBiaW5kX3Jvd3MoKSAlPiUNCiAgYWRkX2NvbHVtbigNCiAgICBmcmVxID0gYygNCiAgICAgIHJlcChyZXBfbWF0cml4WzEsIDFdLCByZXBfbWF0cml4WzEsIDJdKSwNCiAgICAgIHJlcChyZXBfbWF0cml4WzIsIDFdLCByZXBfbWF0cml4WzIsIDJdKSwNCiAgICAgIHJlcChyZXBfbWF0cml4WzMsIDFdLCByZXBfbWF0cml4WzMsIDJdKQ0KICAgICksDQogICAgLmFmdGVyID0gImFuaW1hbF9pZCINCiAgKQ0KYGBgDQoNCg0KYGBge3IgY2FsY3VsYXRpbmcgcmVzcG9uc2UgcHJvYiwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NClJFU1BfUFJPQiA8LSBsZWZ0X2pvaW4oDQogIFNUSU1fUkVTVUxUUyAlPiUNCiAgICBkcGx5cjo6ZmlsdGVyKA0KICAgICAgZmlyc3RfYXBfcmVsdGltZXMgPiBQU1RIX3JhbmdlWzFdLA0KICAgICAgZmlyc3RfYXBfcmVsdGltZXMgPCBQU1RIX3JhbmdlWzJdDQogICAgKSAlPiUNCiAgICBncm91cF9ieShhbmltYWxfaWQsIGZyZXEpICU+JQ0KICAgIHN1bW1hcmlzZShOb19BUHMgPSBsZW5ndGgoZmlyc3RfYXBfcmVsdGltZXMpKSAlPiUgDQogICAgcmVuYW1lKHN0aW1fZnJlcSA9IGZyZXEpICU+JSANCiAgICBtdXRhdGUoc3RpbV9mcmVxID0gcmVwbGFjZShzdGltX2ZyZXEsIHN0aW1fZnJlcSA9PSAxOCwgMjApKSAlPiUgDQogICAgbXV0YXRlKHN0aW1fZnJlcSA9IHJlcGxhY2Uoc3RpbV9mcmVxLCBzdGltX2ZyZXEgPT0gOCwgMTApKSwNCg0KICBSRUNPUkRJTkdTICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoc2lnbmFsX3R5cGUgPT0gInN0aW0iLCBzdGltX2ZyZXFfY2F0ZWcgJWluJSBjKCIxIiwiMTAiLCIyMCIpKSAlPiUNCiAgICBncm91cF9ieShhbmltYWxfaWQsIHN0aW1fZnJlcV9jYXRlZykgJT4lDQogICAgc3VtbWFyaXNlKE5vX3N0aW0gPSBsZW5ndGgoc2lnbmFsX3RpbWUpKSAlPiUgDQogICAgbXV0YXRlKHN0aW1fZnJlcSA9IGFzLm51bWVyaWMoc3RpbV9mcmVxX2NhdGVnKSkgJT4lIA0KICAgIHNlbGVjdCgtc3RpbV9mcmVxX2NhdGVnKQ0KKSAlPiUgDQogIGFkZF9jb2x1bW4oTm9fQVBzX3JhbmdlID0gaGlzdF9zdGF0cyAlPiUgDQogICAgICAgICAgIGFycmFuZ2UoYW5pbWFsX2lkKSAlPiUgDQogICAgICAgICAgIG11dGF0ZShmcmVxID0gcmVwbGFjZShmcmVxLCBmcmVxID09IDE4LCAyMCkpICU+JSANCiAgICAgICAgICAgbXV0YXRlKGZyZXEgPSByZXBsYWNlKGZyZXEsIGZyZXEgPT0gOCwgMTApKSAlPiUgDQogICAgICAgICAgIHJlbmFtZShzdGltX2ZyZXEgPSBmcmVxKSAlPiUgcHVsbChyYW5nZV9jb3VudF9zdW0pKSAlPiUgDQogIG11dGF0ZShyZXNwX3Byb2IgPSAoTm9fQVBzIC8gTm9fc3RpbSkgKiAxMDApICU+JSANCiAgbXV0YXRlKHJlc3BfcHJvYl9yYW5nZSA9IChOb19BUHNfcmFuZ2UgLyBOb19zdGltKSAqIDEwMCkgJT4lIA0KICBhZGRfY29sdW1uKHBlYWtfbGF0ZW5jeSA9IGhpc3Rfc3RhdHMgJT4lIA0KICAgICAgICAgICAgICAgYXJyYW5nZShhbmltYWxfaWQpICU+JQ0KICAgICAgICAgICAgICAgcHVsbChwZWFrKSkgJT4lDQogIGFkZF9jb2x1bW4obWVhbl9sYXRlbmN5ID0gaGlzdF9zdGF0cyAlPiUgDQogICAgICAgICAgICAgICBhcnJhbmdlKGFuaW1hbF9pZCkgJT4lDQogICAgICAgICAgICAgICBwdWxsKG1lYW4pKQ0KDQpgYGANCg0KYGBge3IgY2FsY3VsYXRpbmcgQVAgY291bnQsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpBUENvdW50IDwtIGZ1bmN0aW9uKGFuaW1hbCkgew0KICB0bXBfYXAgPC0gUkVDT1JESU5HUyAlPiUgZHBseXI6OmZpbHRlcihzaWduYWxfdHlwZSA9PSAiQVAiLCBhbmltYWxfaWQgPT0gYW5pbWFsKSAlPiUgc2VsZWN0KHNpZ25hbF90aW1lKSAlPiUgcHVsbCgpIA0KICANCiAgc3RpbV90cmFpbnMgPC0gUkVDT1JESU5HUyAlPiUgDQogICAgZHBseXI6OmZpbHRlcihzaWduYWxfdHlwZSA9PSAic3RpbSIpICU+JSANCiAgICBtdXRhdGUobGFnX3NmYyA9IGxhZyhzdGltX2ZyZXEpLA0KICAgICAgICAgICB0bXBfdmFyID0gaWZlbHNlKGxhZ19zZmMgPT0gc3RpbV9mcmVxICYgIWlzLm5hKGxhZ19zZmMpLCAwLCAxKSwNCiAgICAgICAgICAgY3VtX3RtcF92YXIgPSBjdW1zdW0odG1wX3ZhcikpICU+JSANCiAgICBncm91cF9ieShhbmltYWxfaWQsIHN0aW1fZnJlcSwgY3VtX3RtcF92YXIpICU+JSANCiAgICBtdXRhdGUodHJhaW5fbnVtYmVyID0gZ3JvdXBfaW5kaWNlcygpKSAlPiUNCiAgICB1bmdyb3VwKCkgJT4lDQogICAgc2VsZWN0KC1sYWdfc2ZjLC10bXBfdmFyLC1jdW1fdG1wX3ZhcikgJT4lIA0KICAgIGRwbHlyOjpmaWx0ZXIoYW5pbWFsX2lkID09IGFuaW1hbCkgJT4lIA0KICAgIGdyb3VwX2J5KHN0aW1fZnJlcV9jYXRlZywgdHJhaW5fbnVtYmVyLCBzdGltX251bWJlcikgJT4lIA0KICAgIHN1bW1hcmlzZShOb19BUHMgPSBsZW5ndGgodG1wX2FwW3RtcF9hcCA+IHNpZ25hbF90aW1lICYgdG1wX2FwIDwgc2lnbmFsX3RpbWUgKyAwLjA1XSksDQogICAgICAgICAgICAgIEFQX3RpbWVzID0gcGFzdGUodG1wX2FwW3RtcF9hcCA+IHNpZ25hbF90aW1lICYgdG1wX2FwIDwgc2lnbmFsX3RpbWUgKyAwLjA1XSwgY29sbGFwc2UgPSAiLCIpLA0KICAgICAgICAgICAgICByYW5nZV9sb3dlciA9IHNpZ25hbF90aW1lLA0KICAgICAgICAgICAgICByYW5nZV91cHBlciA9IHNpZ25hbF90aW1lICsgMC4wNSkgJT4lIA0KICAgIGFkZF9jb2x1bW4oYW5pbWFsX2lkID0gYW5pbWFsLCAuYmVmb3JlID0gMSkgJT4lIA0KICAgIHVuZ3JvdXAoKQ0KICByZXR1cm4oc3RpbV90cmFpbnMpDQp9DQogIA0KQVBDIDwtIGxhcHBseShSRUNPUkRJTkdTJGFuaW1hbF9pZCAlPiUgdW5pcXVlLCBBUENvdW50KSAgJT4lIGJpbmRfcm93cygpIA0KDQpgYGANCg0KDQoqIExpc3Qgb2YgdGliYmxlcyB1c2VkIHRvIHN0b3JlIGRhdGE6DQogICsgUkVDT1JESU5HUyB0aWJibGU6IHN0b3JlcyBBUCBhbmQgc3RpbSB0aW1lIHN0YW1wcywgbnVtYmVyIG9mIHN0aW11bGkgaW4gZWFjaCB0cmFpbiwgc3RpbXVsdXMgZnJlcXVlbmN5IGNhdGVnb3JpZXMgKGVnLiA4IDEwIGFuZCAxMiBIeiBiZWxvbmcgdG8gMTAgSHogY2F0ZWdvcnkpDQogICsgU1RJTV9SRVNVTFRTOiBzdG9yZXMgdGhlIGRhdGEgZm9yIFBTVEhzIA0KICArIGhpc3Rfc3RhdHM6IHN0b3JlcyBQU1RIIHN0YXRpc3RpY3MgY2FsY3VsYXRlZCBmcm9tIGdncGxvdCANCiAgKyBSRVNQX1BST0I6IHJlc3BvbnNlIHByb2JhYmlsaXR5IGFuZCBsYXRlbmN5IGRhdGEgY2FsY3VsYXRlZCBmcm9tIHN0aW0gcmVzdWx0cyBhbmQgcmVjb3JkaW5ncw0KICArIEFQQzogbnVtYmVyIG9mIEFQcyBhZnRlciBlYWNoIHN0aW11bHVzIGluIGEgNTAgbXMgd2luZG93DQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHRpZHk9VFJVRX0NCmRhdGF0YWJsZShSRUNPUkRJTkdTLCANCiAgICAgICAgICBjYXB0aW9uID0iUkVDT1JESU5HUyB0aWJibGUiLCANCiAgICAgICAgICByb3duYW1lcyA9IFRSVUUsIA0KICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSA1MCwgc2Nyb2xsWD1ULCBzY3JvbGxZID0gIjUwMHB4IiwgZG9tID0gJ3QnKSkNCg0KDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgdGlkeT1UUlVFfQ0KZGF0YXRhYmxlKFNUSU1fUkVTVUxUUywgDQogICAgICAgICAgY2FwdGlvbiA9IlNUSU1fUkVTVUxUUyB0aWJibGUiLCANCiAgICAgICAgICByb3duYW1lcyA9IFRSVUUsIA0KICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSA1MCwgc2Nyb2xsWD1ULCBzY3JvbGxZID0gIjUwMHB4IiwgZG9tID0gJ3QnKSkNCg0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHRpZHk9VFJVRX0NCmRhdGF0YWJsZShoaXN0X3N0YXRzLCANCiAgICAgICAgICBjYXB0aW9uID0iUFNUSCBzdGF0aXN0aWNzIChoaXN0X3N0YXRzIHRpYmJsZSkiLCANCiAgICAgICAgICByb3duYW1lcyA9IFRSVUUsIA0KICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSA1MCwgc2Nyb2xsWD1ULCBzY3JvbGxZID0gIjUwMHB4IiwgZG9tID0gJ3QnKSkNCg0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpkYXRhdGFibGUoUkVTUF9QUk9CLA0KICAgICAgICAgIGNhcHRpb24gPSAiUmVzcG9uc2UgcHJvYmFiaWxpdGllcyIsDQogICAgICAgICAgcm93bmFtZXMgPSBUUlVFLCANCiAgICAgICAgICBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gNTAsIHNjcm9sbFg9VCwgc2Nyb2xsWT0iNTAwcHgiLGRvbSA9ICd0JykpDQoNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZGF0YXRhYmxlKEFQQywNCiAgICAgICAgICBjYXB0aW9uID0gIk51bWJlciBvZiBBUHMgZm9sb3dpbmcgZWFjaCBzdGltdWx1cyIsDQogICAgICAgICAgcm93bmFtZXMgPSBUUlVFLCANCiAgICAgICAgICBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gNTAsIHNjcm9sbFg9VCwgc2Nyb2xsWT0iNTAwcHgiLGRvbSA9ICd0JykpDQoNCmBgYA0KDQoNCiMjIFBsb3R0aW5nDQoNCiMjIyBEaXN0cmlidXRpb24gb2YgZnJpc3QgQVBzIGFmdGVyIGNvcnRpY2FsIGFjdGl2YXRpb24NCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCnNvdXJjZShmaWxlLnBhdGgoInN1cHBsZW1lbnRhcnlfZnVuY3Rpb25zIiwgImdlb21fZmxhdF92aW9saW4uUiIpKQ0KI1BTVEhfcmFuZ2UgPC0gYygwLCAwLjA1KQ0KZ2dwbG90KA0KICBkYXRhID0gU1RJTV9SRVNVTFRTICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoDQogICAgICBmaXJzdF9hcF9yZWx0aW1lcyA+IFBTVEhfcmFuZ2VbMV0sDQogICAgICBmaXJzdF9hcF9yZWx0aW1lcyA8IFBTVEhfcmFuZ2VbMl0NCiAgICApLA0KICBtYXBwaW5nID0gYWVzKHkgPSBmaXJzdF9hcF9yZWx0aW1lcywgeCA9IGFuaW1hbF9pZCkNCikgKw0KICBjb29yZF9mbGlwKCkgKw0KICBnZ2hhbHZlczo6Z2VvbV9oYWxmX3Zpb2xpbihzaWRlID0gInIiLCB0cmltID0gVCwgc2NhbGUgPSAid2lkdGgiKSArDQogICMgZ2VvbV9kb3RwbG90KGJpbmF4aXMgPSAieSIsIA0KICAjICAgICAgICAgICAgICBkb3RzaXplID0gNCwgDQogICMgICAgICAgICAgICAgIHN0YWNrZGlyID0gImRvd24iLCANCiAgIyAgICAgICAgICAgICAgYmlud2lkdGggPSAwLjAwMDIsbWV0aG9kID0gImhpc3RvZG90IixiaW5wb3NpdGlvbnMgPSAiYWxsIiwNCiAgIyAgICAgICAgICAgICAgKSArDQogICMgc2VlOjpnZW9tX3Zpb2xpbmRvdChiaW53aWR0aCA9IDAuMDAwMSxzaXplX2RvdHMgPSA2LCkgKw0KICBnZW9tX2ppdHRlcihwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcigwKSwgc2hhcGUgPSAifCIpICsNCiAgIyBnZW9tX2JveHBsb3Qod2lkdGggPSAuMSwgb3V0bGllci5jb2xvdXIgPSBOQSwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsNCiAgZmFjZXRfd3JhcCh+ZnJlcSkNCg0KYGBgDQoNCiMjIyBQU1RIIEAgMSBIeiBjb3J0aWNhbCBhY3RpdmF0aW9uDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMjIyBtYWluIHBsb3QNCiANCiMjIyBzZXQgUFNUSCByYW5nZTogc2VlIGVhcmxpZXIgKGNhbGN1bGF0aW5nIGhpc3Qgc3RhdHMgY2h1bmspDQoNCiMjIyBzZWxlY3QgZnJlcXVlbmN5IHRvIHBsb3QgKDEsIDgsIDE4KQ0KZnJlcV90b19wbG90IDwtIDEgJT4lIGFzLmNoYXJhY3RlcigpDQoNCmdwX2hpc3QgPC0gZ2dwbG90KA0KICBkYXRhID0gU1RJTV9SRVNVTFRTICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoDQogICAgICBmaXJzdF9hcF9yZWx0aW1lcyA+IFBTVEhfcmFuZ2VbMV0sDQogICAgICBmaXJzdF9hcF9yZWx0aW1lcyA8IFBTVEhfcmFuZ2VbMl0sDQogICAgICBmcmVxID09IGZyZXFfdG9fcGxvdA0KICAgICAgIyBhbmltYWxfaWQgPT0gIkdJSV8yMSINCiAgICApLA0KICBtYXBwaW5nID0gYWVzKHggPSBmaXJzdF9hcF9yZWx0aW1lcykNCikgKw0KICB4bGltKFBTVEhfcmFuZ2VbMV0sIFBTVEhfcmFuZ2VbMl0pICsNCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKGZpbGwgPSBhbmltYWxfaWQpLCBiaW53aWR0aCA9IDAuMDAxKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKA0KICAgIHBhbGV0dGUgPSAiU2V0MyIsDQogICAgbmFtZSA9ICJBbmltYWwiDQogICAgIyBndWlkZSA9IEZBTFNFDQogICkgKw0KICBmYWNldF93cmFwKH5hbmltYWxfaWQsIG5jb2wgPSAzKSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsNCiAgeGxhYigiVGltZSAocykiKSArDQogIHlsYWIoIkNvdW50IikNCg0KDQoNCiMjIyBsaW5lcyANCmdwX2hpc3QgKw0KICAjIyMgbWVkaWFuDQogIGdlb21fc2VnbWVudCgNCiAgICBkYXRhID0gaGlzdF9zdGF0cyAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoZnJlcSA9PSBmcmVxX3RvX3Bsb3QpICU+JQ0KICAgICAgZHBseXI6Omdyb3VwX2J5KGFuaW1hbF9pZCksDQogICAgbWFwcGluZyA9IGFlcygNCiAgICAgIHggPSBtZWRpYW4sDQogICAgICB4ZW5kID0gbWVkaWFuLA0KICAgICAgeSA9IHlfbWF4ICsgNywNCiAgICAgIHllbmQgPSB5X21heCArIDE4DQogICAgKSwNCiAgICBzaXplID0gMQ0KICApICsNCg0KICAjIyMgZGF0YSByYW5nZQ0KICBnZW9tX3NlZ21lbnQoDQogICAgZGF0YSA9IGhpc3Rfc3RhdHMgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGZyZXEgPT0gZnJlcV90b19wbG90KSAlPiUNCiAgICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQpLA0KICAgIG1hcHBpbmcgPSBhZXMoDQogICAgICB4ID0gcXVhbnRpbGUyNSAtIDEuNSAqIElRUiwNCiAgICAgIHhlbmQgPSBxdWFudGlsZTI1LA0KICAgICAgeSA9IHlfbWF4ICsgMTIuNSwNCiAgICAgIHllbmQgPSB5X21heCArIDEyLjUNCiAgICApDQogICkgKw0KDQogIGdlb21fc2VnbWVudCgNCiAgICBkYXRhID0gaGlzdF9zdGF0cyAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoZnJlcSA9PSBmcmVxX3RvX3Bsb3QpICU+JQ0KICAgICAgZHBseXI6Omdyb3VwX2J5KGFuaW1hbF9pZCksDQogICAgbWFwcGluZyA9IGFlcyh4ID0gcXVhbnRpbGU3NSwgeGVuZCA9IHF1YW50aWxlNzUgKyAxLjUgKiBJUVIsIHkgPSB5X21heCArIDEyLjUsIHllbmQgPSB5X21heCArIDEyLjUpDQogICkgKw0KDQogICMjIyBJUVIgKGJveCkNCiAgZ2VvbV9yZWN0KA0KICAgIGRhdGEgPSBoaXN0X3N0YXRzICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihmcmVxID09IGZyZXFfdG9fcGxvdCkgJT4lDQogICAgICBkcGx5cjo6Z3JvdXBfYnkoYW5pbWFsX2lkKSwNCiAgICBtYXBwaW5nID0gYWVzKHhtaW4gPSBxdWFudGlsZTI1LCB4bWF4ID0gcXVhbnRpbGU3NSwgeW1pbiA9IHlfbWF4ICsgNywgeW1heCA9IHlfbWF4ICsgMTgpLA0KICAgIGNvbG9yID0gInJlZCIsDQogICAgYWxwaGEgPSAwLA0KICAgIGluaGVyaXQuYWVzID0gRg0KICApICsNCg0KICAjIyMgbWVhbg0KICBnZW9tX3BvaW50KA0KICAgIGRhdGEgPSBoaXN0X3N0YXRzICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihmcmVxID09IGZyZXFfdG9fcGxvdCkgJT4lDQogICAgICBkcGx5cjo6Z3JvdXBfYnkoYW5pbWFsX2lkKSwNCiAgICBtYXBwaW5nID0gYWVzKHggPSBtZWFuLCB5ID0geV9tYXggKyA0KSwgc2l6ZSA9IDINCiAgKSArDQoNCiAgIyMjIHBlYWsNCiAgZ2VvbV9wb2ludCgNCiAgICBkYXRhID0gaGlzdF9zdGF0cyAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoZnJlcSA9PSBmcmVxX3RvX3Bsb3QpICU+JQ0KICAgICAgZHBseXI6Omdyb3VwX2J5KGFuaW1hbF9pZCksDQogICAgbWFwcGluZyA9IGFlcyh4ID0gcGVhaywgeSA9IHlfbWF4ICsgNCksDQogICAgc2hhcGUgPSAyNSwNCiAgICBzaXplID0gMiwNCiAgICBmaWxsID0gInJlZCINCiAgKQ0KDQpgYGANCg0KIyMjIFBTVEggQCAxMCBIeiBjb3J0aWNhbCBhY3RpdmF0aW9uDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMjIyBtYWluIHBsb3QNCg0KIyMjIHNldCBQU1RIIHJhbmdlOiBzZWUgZWFybGllciAoY2FsY3VsYXRpbmcgaGlzdCBzdGF0cyBjaHVuaykNCg0KIyMjIHNlbGVjdCBmcmVxdWVuY3kgdG8gcGxvdCAoMSwgOCwgMTgpDQpmcmVxX3RvX3Bsb3QgPC0gOCAlPiUgYXMuY2hhcmFjdGVyKCkNCg0KZ3BfaGlzdCA8LSBnZ3Bsb3QoDQogIGRhdGEgPSBTVElNX1JFU1VMVFMgJT4lDQogICAgZHBseXI6OmZpbHRlcigNCiAgICAgIGZpcnN0X2FwX3JlbHRpbWVzID4gUFNUSF9yYW5nZVsxXSwNCiAgICAgIGZpcnN0X2FwX3JlbHRpbWVzIDwgUFNUSF9yYW5nZVsyXSwNCiAgICAgIGZyZXEgPT0gZnJlcV90b19wbG90DQogICAgICAjIGFuaW1hbF9pZCA9PSAiR0lJXzIxIg0KICAgICksDQogIG1hcHBpbmcgPSBhZXMoeCA9IGZpcnN0X2FwX3JlbHRpbWVzKQ0KKSArDQogIHhsaW0oUFNUSF9yYW5nZVsxXSwgUFNUSF9yYW5nZVsyXSkgKw0KICBnZW9tX2hpc3RvZ3JhbShhZXMoZmlsbCA9IGFuaW1hbF9pZCksIGJpbndpZHRoID0gMC4wMDEpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIoDQogICAgcGFsZXR0ZSA9ICJTZXQzIiwNCiAgICBuYW1lID0gIkFuaW1hbCINCiAgICAjIGd1aWRlID0gRkFMU0UNCiAgKSArDQogIGZhY2V0X3dyYXAofmFuaW1hbF9pZCwgbmNvbCA9IDMpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKw0KICB4bGFiKCJUaW1lIChzKSIpICsNCiAgeWxhYigiQ291bnQiKQ0KDQoNCg0KIyMjIGxpbmVzIA0KZ3BfaGlzdCArDQogICMjIyBtZWRpYW4NCiAgZ2VvbV9zZWdtZW50KA0KICAgIGRhdGEgPSBoaXN0X3N0YXRzICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihmcmVxID09IGZyZXFfdG9fcGxvdCkgJT4lDQogICAgICBkcGx5cjo6Z3JvdXBfYnkoYW5pbWFsX2lkKSwNCiAgICBtYXBwaW5nID0gYWVzKA0KICAgICAgeCA9IG1lZGlhbiwNCiAgICAgIHhlbmQgPSBtZWRpYW4sDQogICAgICB5ID0geV9tYXggKyA3LA0KICAgICAgeWVuZCA9IHlfbWF4ICsgMTgNCiAgICApLA0KICAgIHNpemUgPSAxDQogICkgKw0KDQogICMjIyBkYXRhIHJhbmdlDQogIGdlb21fc2VnbWVudCgNCiAgICBkYXRhID0gaGlzdF9zdGF0cyAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoZnJlcSA9PSBmcmVxX3RvX3Bsb3QpICU+JQ0KICAgICAgZHBseXI6Omdyb3VwX2J5KGFuaW1hbF9pZCksDQogICAgbWFwcGluZyA9IGFlcygNCiAgICAgIHggPSBxdWFudGlsZTI1IC0gMS41ICogSVFSLA0KICAgICAgeGVuZCA9IHF1YW50aWxlMjUsDQogICAgICB5ID0geV9tYXggKyAxMi41LA0KICAgICAgeWVuZCA9IHlfbWF4ICsgMTIuNQ0KICAgICkNCiAgKSArDQoNCiAgZ2VvbV9zZWdtZW50KA0KICAgIGRhdGEgPSBoaXN0X3N0YXRzICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihmcmVxID09IGZyZXFfdG9fcGxvdCkgJT4lDQogICAgICBkcGx5cjo6Z3JvdXBfYnkoYW5pbWFsX2lkKSwNCiAgICBtYXBwaW5nID0gYWVzKHggPSBxdWFudGlsZTc1LCB4ZW5kID0gcXVhbnRpbGU3NSArIDEuNSAqIElRUiwgeSA9IHlfbWF4ICsgMTIuNSwgeWVuZCA9IHlfbWF4ICsgMTIuNSkNCiAgKSArDQoNCiAgIyMjIElRUiAoYm94KQ0KICBnZW9tX3JlY3QoDQogICAgZGF0YSA9IGhpc3Rfc3RhdHMgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGZyZXEgPT0gZnJlcV90b19wbG90KSAlPiUNCiAgICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQpLA0KICAgIG1hcHBpbmcgPSBhZXMoeG1pbiA9IHF1YW50aWxlMjUsIHhtYXggPSBxdWFudGlsZTc1LCB5bWluID0geV9tYXggKyA3LCB5bWF4ID0geV9tYXggKyAxOCksDQogICAgY29sb3IgPSAicmVkIiwNCiAgICBhbHBoYSA9IDAsDQogICAgaW5oZXJpdC5hZXMgPSBGDQogICkgKw0KDQogICMjIyBtZWFuDQogIGdlb21fcG9pbnQoDQogICAgZGF0YSA9IGhpc3Rfc3RhdHMgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGZyZXEgPT0gZnJlcV90b19wbG90KSAlPiUNCiAgICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQpLA0KICAgIG1hcHBpbmcgPSBhZXMoeCA9IG1lYW4sIHkgPSB5X21heCArIDQpLCBzaXplID0gMg0KICApICsNCg0KICAjIyMgcGVhaw0KICBnZW9tX3BvaW50KA0KICAgIGRhdGEgPSBoaXN0X3N0YXRzICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihmcmVxID09IGZyZXFfdG9fcGxvdCkgJT4lDQogICAgICBkcGx5cjo6Z3JvdXBfYnkoYW5pbWFsX2lkKSwNCiAgICBtYXBwaW5nID0gYWVzKHggPSBwZWFrLCB5ID0geV9tYXggKyA0KSwNCiAgICBzaGFwZSA9IDI1LA0KICAgIHNpemUgPSAyLA0KICAgIGZpbGwgPSAicmVkIg0KICApDQoNCmBgYA0KDQojIyMgUFNUSCBAIDIwIEh6IGNvcnRpY2FsIGFjdGl2YXRpb24NCg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTgsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIyMgbWFpbiBwbG90DQoNCiMjIyBzZXQgUFNUSCByYW5nZTogc2VlIGVhcmxpZXIgKGNhbGN1bGF0aW5nIGhpc3Qgc3RhdHMgY2h1bmspDQoNCiMjIyBzZWxlY3QgZnJlcXVlbmN5IHRvIHBsb3QgKDEsIDgsIDE4KQ0KZnJlcV90b19wbG90IDwtIDE4ICU+JSBhcy5jaGFyYWN0ZXIoKQ0KDQpncF9oaXN0IDwtIGdncGxvdCgNCiAgZGF0YSA9IFNUSU1fUkVTVUxUUyAlPiUNCiAgICBkcGx5cjo6ZmlsdGVyKA0KICAgICAgZmlyc3RfYXBfcmVsdGltZXMgPiBQU1RIX3JhbmdlWzFdLA0KICAgICAgZmlyc3RfYXBfcmVsdGltZXMgPCBQU1RIX3JhbmdlWzJdLA0KICAgICAgZnJlcSA9PSBmcmVxX3RvX3Bsb3QNCiAgICAgICMgYW5pbWFsX2lkID09ICJHSUlfMjEiDQogICAgKSwNCiAgbWFwcGluZyA9IGFlcyh4ID0gZmlyc3RfYXBfcmVsdGltZXMpDQopICsNCiAgeGxpbShQU1RIX3JhbmdlWzFdLCBQU1RIX3JhbmdlWzJdKSArDQogIGdlb21faGlzdG9ncmFtKGFlcyhmaWxsID0gYW5pbWFsX2lkKSwgYmlud2lkdGggPSAwLjAwMSkgKw0KICBzY2FsZV9maWxsX2JyZXdlcigNCiAgICBwYWxldHRlID0gIlNldDMiLA0KICAgIG5hbWUgPSAiQW5pbWFsIg0KICAgICMgZ3VpZGUgPSBGQUxTRQ0KICApICsNCiAgZmFjZXRfd3JhcCh+YW5pbWFsX2lkLCBuY29sID0gMykgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArDQogIHhsYWIoIlRpbWUgKHMpIikgKw0KICB5bGFiKCJDb3VudCIpDQoNCg0KDQojIyMgbGluZXMgDQpncF9oaXN0ICsNCiAgIyMjIG1lZGlhbg0KICBnZW9tX3NlZ21lbnQoDQogICAgZGF0YSA9IGhpc3Rfc3RhdHMgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGZyZXEgPT0gZnJlcV90b19wbG90KSAlPiUNCiAgICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQpLA0KICAgIG1hcHBpbmcgPSBhZXMoDQogICAgICB4ID0gbWVkaWFuLA0KICAgICAgeGVuZCA9IG1lZGlhbiwNCiAgICAgIHkgPSB5X21heCArIDcsDQogICAgICB5ZW5kID0geV9tYXggKyAxOA0KICAgICksDQogICAgc2l6ZSA9IDENCiAgKSArDQoNCiAgIyMjIGRhdGEgcmFuZ2UNCiAgZ2VvbV9zZWdtZW50KA0KICAgIGRhdGEgPSBoaXN0X3N0YXRzICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihmcmVxID09IGZyZXFfdG9fcGxvdCkgJT4lDQogICAgICBkcGx5cjo6Z3JvdXBfYnkoYW5pbWFsX2lkKSwNCiAgICBtYXBwaW5nID0gYWVzKA0KICAgICAgeCA9IHF1YW50aWxlMjUgLSAxLjUgKiBJUVIsDQogICAgICB4ZW5kID0gcXVhbnRpbGUyNSwNCiAgICAgIHkgPSB5X21heCArIDEyLjUsDQogICAgICB5ZW5kID0geV9tYXggKyAxMi41DQogICAgKQ0KICApICsNCg0KICBnZW9tX3NlZ21lbnQoDQogICAgZGF0YSA9IGhpc3Rfc3RhdHMgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGZyZXEgPT0gZnJlcV90b19wbG90KSAlPiUNCiAgICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQpLA0KICAgIG1hcHBpbmcgPSBhZXMoeCA9IHF1YW50aWxlNzUsIHhlbmQgPSBxdWFudGlsZTc1ICsgMS41ICogSVFSLCB5ID0geV9tYXggKyAxMi41LCB5ZW5kID0geV9tYXggKyAxMi41KQ0KICApICsNCg0KICAjIyMgSVFSIChib3gpDQogIGdlb21fcmVjdCgNCiAgICBkYXRhID0gaGlzdF9zdGF0cyAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoZnJlcSA9PSBmcmVxX3RvX3Bsb3QpICU+JQ0KICAgICAgZHBseXI6Omdyb3VwX2J5KGFuaW1hbF9pZCksDQogICAgbWFwcGluZyA9IGFlcyh4bWluID0gcXVhbnRpbGUyNSwgeG1heCA9IHF1YW50aWxlNzUsIHltaW4gPSB5X21heCArIDcsIHltYXggPSB5X21heCArIDE4KSwNCiAgICBjb2xvciA9ICJyZWQiLA0KICAgIGFscGhhID0gMCwNCiAgICBpbmhlcml0LmFlcyA9IEYNCiAgKSArDQoNCiAgIyMjIG1lYW4NCiAgZ2VvbV9wb2ludCgNCiAgICBkYXRhID0gaGlzdF9zdGF0cyAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoZnJlcSA9PSBmcmVxX3RvX3Bsb3QpICU+JQ0KICAgICAgZHBseXI6Omdyb3VwX2J5KGFuaW1hbF9pZCksDQogICAgbWFwcGluZyA9IGFlcyh4ID0gbWVhbiwgeSA9IHlfbWF4ICsgNCksIHNpemUgPSAyDQogICkgKw0KDQogICMjIyBwZWFrDQogIGdlb21fcG9pbnQoDQogICAgZGF0YSA9IGhpc3Rfc3RhdHMgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGZyZXEgPT0gZnJlcV90b19wbG90KSAlPiUNCiAgICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQpLA0KICAgIG1hcHBpbmcgPSBhZXMoeCA9IHBlYWssIHkgPSB5X21heCArIDQpLA0KICAgIHNoYXBlID0gMjUsDQogICAgc2l6ZSA9IDIsDQogICAgZmlsbCA9ICJyZWQiDQogICkNCmBgYA0KDQoNCiMjIyBSZXNwb25zZSBwcm9iYWJpbGl0eSBhbmQgbGF0ZW5jeQ0KDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ2dwbG90KA0KICBkYXRhID0gUkVTUF9QUk9CICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoYW5pbWFsX2lkICE9ICJHSUlfMjAiKSwNCiAgbWFwcGluZyA9IGFlcygNCiAgICB4ID0gYXMuZmFjdG9yKHN0aW1fZnJlcSksDQogICAgeSA9IHJlc3BfcHJvYl9yYW5nZQ0KICApKSArDQogIGdlb21fcG9pbnQoDQogICAgYWVzKGZpbGwgPSBhbmltYWxfaWQpLA0KICAgIGNvbG9yID0gImJsYWNrIiwNCiAgICBzaXplID0gMywNCiAgICBzaGFwZSA9IDIxLA0KICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKDAuMSkNCiAgKSArDQogICMgZ2VvbV9saW5lKGFlcyhncm91cCA9IGFuaW1hbF9pZCkpICsNCiAgZ2VvbV9ib3hwbG90KGFscGhhID0gMCwgd2lkdGggPSAwLjIsIGx3ZCA9IDEsIGZhdHRlbiA9IDEuMikgKw0KICB4bGFiKCJTdGltdWx1cyBmcmVxdWVuY3kiKSArDQogIHlsYWIoIlJlc3BvbnNlIHByb2JhYmlsaXR5IikgKw0KICBnZW9tX3NpZ25pZihjb21wYXJpc29ucyA9IGxpc3QoYygiMSIsICIxMCIpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9zaWduaWZfbGV2ZWwgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdCA9ICJtb29kLnRlc3QiKSArDQogIGdlb21fc2lnbmlmKGNvbXBhcmlzb25zID0gbGlzdChjKCIxMCIsICIyMCIpKSwNCiAgICAgICAgICAgICAgbWFwX3NpZ25pZl9sZXZlbCA9IFRSVUUsDQogICAgICAgICAgICAgIHRlc3QgPSAibW9vZC50ZXN0IikNCg0KDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpnZ3Bsb3QoZGF0YSA9IFJFU1BfUFJPQiAlPiUgDQogICAgICAgICBnYXRoZXIoa2V5ID0gImxhdGVuY3lfdHlwZSIsIA0KICAgICAgICAgICAgICAgIHZhbHVlID0gImxhdGVuY3lfdmFsdWUiLA0KICAgICAgICAgICAgICAgIHBlYWtfbGF0ZW5jeSwgDQogICAgICAgICAgICAgICAgbWVhbl9sYXRlbmN5KSAlPiUgDQogICAgICAgICBkcGx5cjo6ZmlsdGVyKGFuaW1hbF9pZCAhPSAiR0lJXzIwIiksDQogICAgICAgbWFwcGluZyA9IGFlcyh4ID0gYXMuZmFjdG9yKHN0aW1fZnJlcSksIA0KICAgICAgICAgICAgICAgICAgICAgeSA9IGxhdGVuY3lfdmFsdWUqMTAwMCkpICsNCiAgIyMjIGRhdGEgdmlzdWFsaXphdGlvbiBsYXllcnMNCiAgZ2VvbV9wb2ludCgNCiAgICBhZXMoY29sb3IgPSBsYXRlbmN5X3R5cGUpLA0KICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMC40KSwNCiAgICBzaXplID0gMw0KICApICsNCiAgZ2VvbV9ib3hwbG90KA0KICAgIGFlcyhjb2xvciA9IGxhdGVuY3lfdHlwZSksDQogICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjQpLA0KICAgIHdpZHRoID0gMC4zLA0KICAgIGFscGhhID0gMCwNCiAgICBsd2QgPSAxLA0KICAgIGZhdHRlbiA9IDEuMg0KICApICsNCiAgeWxpbSgwLDI1KSArDQogIHhsYWIoIlN0aW11bHVzIGZyZXF1ZW5jeSIpICsNCiAgeWxhYigiUGVhayBsYXRlbmN5IikgKw0KICBzY2FsZV9jb2xvcl9kaXNjcmV0ZShuYW1lID0gIkxhdGVuY3kiLA0KICAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKCJtZWFuX2xhdGVuY3kiLCAicGVha19sYXRlbmN5IiksDQogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIk1lYW4iLCAiUGVhayIpKQ0KYGBgDQoNCg0KIyMjIE51bWJlciBvZiBBUHMgYWZ0ZXIgZWFjaCBzdGltdWx1cyBpbiBzdGltdWx1cyB0cmFpbnMgKDUwIG1zIHdpbmRvdykNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpnZ3Bsb3QoDQogIGRhdGEgPSBBUEMgJT4lDQogICAgZHBseXI6OmZpbHRlcihzdGltX2ZyZXFfY2F0ZWcgJWluJSBjKCIxIiwiMTAiLCAiMjAiKSwgc3RpbV9udW1iZXIgPCAxMSkgJT4lIA0KICAgIGdyb3VwX2J5KGFuaW1hbF9pZCwgc3RpbV9mcmVxX2NhdGVnLCBzdGltX251bWJlcikgJT4lIA0KICAgIHN1bW1hcmlzZShOb19BUHMgPSBzdW0oTm9fQVBzKSkgJT4lIA0KICAgIHVuZ3JvdXAoKSAlPiUgDQogICAgZ3JvdXBfYnkoc3RpbV9mcmVxX2NhdGVnLCBzdGltX251bWJlcikgJT4lIA0KICAgIHN1bW1hcmlzZShOb19BUF9tZWFuID0gbWVhbihOb19BUHMpLA0KICAgICAgICAgICAgICBOb19BUF9zZCA9IHNkKE5vX0FQcyksDQogICAgICAgICAgICAgIFNFTSA9IHNkKE5vX0FQcykgLyBzcXJ0KGxlbmd0aChOb19BUHMpKSkgDQogICwNCiAgbWFwcGluZyA9IGFlcygNCiAgICB4ID0gc3RpbV9udW1iZXIsDQogICAgeSA9IE5vX0FQX21lYW4sDQogICAgY29sb3VyID0gYXMuZmFjdG9yKHN0aW1fZnJlcV9jYXRlZyksDQogICAgZ3JvdXAgPSBhcy5mYWN0b3Ioc3RpbV9mcmVxX2NhdGVnKQ0KICApDQopICsNCiAgZ2VvbV9wb2ludCgpICsNCiAgZ2VvbV9saW5lKCkgKw0KICB4bGFiKCJOby4gc3RpbXVsdXMgaW4gdHJhaW4iKSArDQogIHlsYWIoIk1lYW4gbm8uIEFQcyBhY2Nyb3NzIGFuaW1hbHMiKSArDQogIGxhYnMoY29sb3IgPSAiRnJlcXVlbmN5IikgKw0KICB5bGltKDAsMTgpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBhcy5jaGFyYWN0ZXIoYygxOjEwKSkpIA0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD00LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ2dwbG90KGRhdGEgPSBBUEMgJT4lDQogICAgICAgICBkcGx5cjo6ZmlsdGVyKHN0aW1fZnJlcV9jYXRlZyAlaW4lIGMoIjEiLCIxMCIsICIyMCIpLCBzdGltX251bWJlciA8IDExKSAlPiUgDQogICAgICAgICBncm91cF9ieShhbmltYWxfaWQsIHN0aW1fZnJlcV9jYXRlZywgc3RpbV9udW1iZXIpICU+JSANCiAgICAgICAgIHN1bW1hcmlzZShOb19BUHMgPSBzdW0oTm9fQVBzKSksDQogICAgICAgbWFwcGluZyA9IGFlcyh4ID0gc3RpbV9udW1iZXIsIA0KICAgICAgICAgICAgICAgICAgICAgeSA9IE5vX0FQcywNCiAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gYXMuZmFjdG9yKGFuaW1hbF9pZCksDQogICAgICAgICAgICAgICAgICAgICBsaW5ldHlwZSA9IGFzLmZhY3RvcihhbmltYWxfaWQpKSkgKw0KICBnZW9tX3BvaW50KCkgKw0KICBnZW9tX2xpbmUoKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygxOjEwKSxicmVha3MgPSBjKDE6MTApKSArDQogIGdlb21fbGFiZWxfcmVwZWwoDQogICAgICAgIGRhdGEgPSAuICU+JSANCiAgICAgICAgICBkcGx5cjo6ZmlsdGVyKHN0aW1fbnVtYmVyID09IDEwKSwNCiAgICAgICAgYWVzKGxhYmVsID0gYW5pbWFsX2lkKSwNCiAgICAgICAgZGlyZWN0aW9uID0gInkiLA0KICAgICAgICBoanVzdCA9IC0yDQogICAgICApICsNCiAgZXhwYW5kX2xpbWl0cyh4ID0gMTIpICsNCg0KICAjeGxpbSgxLDEwKSArDQogIGZhY2V0X3dyYXAofnN0aW1fZnJlcV9jYXRlZykgKw0KICBsYWJzKGxpbmV0eXBlID0gIkFuaW1hbHMiLGNvbG9yID0gIkFuaW1hbHMiKSArDQogIHhsYWIoIk5vLiBzdGltdWx1cyBpbiB0cmFpbiIpICsNCiAgeWxhYigiTnVtYmVyIG9mIEFQcyIpIA0KICANCg0KYGBgDQoNCg0KDQojIFNwb250YW5lb3VzIGRlc3luY2hyb25pemF0aW9uIG9mIHRoZSBGQyBzbG93IG9zY2lsbGF0aW9uIA0KDQoNCg0KYGBge3IsICBlY2hvPUZBTFNFLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCmZpbGVfbGlzdCA8LSBsaXN0LmZpbGVzKA0KICBwYXRoID0gImRhdGEiLA0KICBwYXR0ZXJuID0gIioubWF0IiwgZnVsbC5uYW1lcyA9IEYsIHJlY3Vyc2l2ZSA9IEYNCikNCg0KYGBgDQoNCg0KYGBge3J9DQpmaWxlX3RvX2xvYWQgPC0gZmlsZV9saXN0W1sxXV0NCmZpbGVuYW1lIDwtIGFzLmNoYXJhY3RlcihzdWJzdHJpbmcoZmlsZV90b19sb2FkLCAxLCBuY2hhcihmaWxlX3RvX2xvYWQpIC0gNCkpDQpyYXcucmVjIDwtIHJlYWRNYXQoZmlsZS5wYXRoKCJkYXRhIiwgZmlsZV90b19sb2FkKSkNCg0KIyMjdGFrZXMgdGhlIGZpcnN0IEFQIChmaXJzdCByb3cpIGFuZCB0ZWxscyB0aGUgaW5kZXggb2YgcG9pbnQgd2l0aCB0aGUgbWF4IHZhbHVlDQpwb2ludHNfdG9fcGVhayA8LSB3aGljaChyYXcucmVjJGFwWywgLCAxXSR2YWx1ZXNbMSwgXSA9PQ0KICAgIG1heChyYXcucmVjJGFwWywgLCAxXSR2YWx1ZXNbMSwgXSkpICU+JQ0KICAgIGFzLm51bWVyaWMoKQ0KDQojIyMgdGltZSBvZiB0aGUgcGVhayBvZiB0aGUgQVBzIGFmdGVyIGl0cyBmaXJzdCBwb2ludA0KcmF3LnJlYyRhcFssICwgMV0kaW50ZXJ2YWwgKiBwb2ludHNfdG9fcGVhaw0KDQphcCA8LSByYXcucmVjJGFwWywgLCAxXSR0aW1lcyAlPiUgYXMuZG91YmxlKCkNCmFwX3BlYWtzIDwtIHRpYmJsZShwZWFrX3RpbWVzID0gKGFwICsgYyhyYXcucmVjJGFwWywgLCAxXSRpbnRlcnZhbCAqIHBvaW50c190b19wZWFrKSkpDQoNCg0KYGBgDQoNCg0KLS0tLS0tLSBpbnNlcnQgY29kZSBoZXJlIC0tLS0tLS0tDQogDQooc3BvbnRfZGVzeW5jaHJvbl9hbmFseXNpcy5SKSwgNyByZWNvcmRpbmdzDQoNCiMgVGVybWluYWxzDQoNCiMjIExvYWRpbmcgZGF0YQ0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCB0aWR5PVRSVUV9DQpmaWxlX3BhdGggPC0gZmlsZS5wYXRoKCdkYXRhJywNCiAgICAgICAgICAgICAgICAgICAgICAgJ0VtaV90ZXJtaW5hbHMnLA0KICAgICAgICAgICAgICAgICAgICAgICAndGVybWluYWxfbWVhc3VyZXMuY3N2JyApICANClRFUk1JTkFMUyA8LSByZWFkLnRhYmxlKGZpbGUgPSBmaWxlX3BhdGgsIHNlcCA9ICc7JywgaGVhZGVyID0gVCwgbmEuc3RyaW5nID0gJ25hJykNCmhlYWQoVEVSTUlOQUxTKQ0KDQpgYGANCg0KIyMgQm91dG9uIGFyZWEgb24gZGlmZmVyZW50IGRlbmRyaXRpYyBkb21haW5zDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdncGxvdChkYXRhID0gVEVSTUlOQUxTLCBtYXBwaW5nID0gYWVzKHggPSBwb3N0aW9uLCB5ID0gYl9hcmVhKSkgKw0KICBnZW9tX2hhbGZfdmlvbGluKHBvc2l0aW9uID0gcG9zaXRpb25fbnVkZ2UoeD0tLjE1KSwNCiAgICAgICAgICAgICAgICAgIHRyaW0gPSBGLA0KICAgICAgICAgICAgICAgICAgc2lkZSA9ICJsIiwNCiAgICAgICAgICAgICAgICAgIHNjYWxlID0gImFyZWEiLA0KICAgICAgICAgICAgICAgICAgZHJhd19xdWFudGlsZXMgPSBjKDAuNSksDQogICAgICAgICAgICAgICAgICBhZXMoZmlsbCA9IHBvc3Rpb24pKSArDQogIGdlb21faml0dGVyKHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKDAuMSkpDQoNCmBgYA0KDQojIyBBcmVhIG9mIGJvdXRvbnMgd2l0aCAqbTIqIGFuZCAqdW5rbm93biogb3JpZ2luDQoNCmBgYHtyIGZpZy53aWR0aD0xMCwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCmdncGxvdChkYXRhID0gVEVSTUlOQUxTLA0KICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IG9yaWdpbiwgeSA9IGJfYXJlYSkpICsNCiAgZ2VvbV9oYWxmX3Zpb2xpbihwb3NpdGlvbiA9IHBvc2l0aW9uX251ZGdlKHg9LS4xNSksDQogICAgICAgICAgICAgICAgICAgdHJpbSA9IEYsDQogICAgICAgICAgICAgICAgICAgc2lkZSA9ICJsIiwNCiAgICAgICAgICAgICAgICAgICBzY2FsZSA9ICJjb3VudCIsDQogICAgICAgICAgICAgICAgICAgZHJhd19xdWFudGlsZXMgPSBjKDAuNSkNCiAgICAgICAgICAgICAgICAgICAjZmlsbCA9IGFscGhhKDAuMSksDQogICAgICAgICAgICAgICAgICAgI2Flcyhjb2wgPSBwb3N0aW9uKQ0KICAgICAgICAgICAgICAgICAgICkgKw0KICBnZW9tX2ppdHRlcihwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcigwLjEpLA0KICAgICAgICAgICAgICBhZXMoY29sID0gcG9zdGlvbikpICsNCiAgYW5ub3RhdGUoInRleHQiLA0KICAgICAgICAgICB4ID0gMC43LCANCiAgICAgICAgICAgeSA9IDEsIA0KICAgICAgICAgICBsYWJlbCA9IHBhc3RlKCJuID0gIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgVEVSTUlOQUxTICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBfYnkob3JpZ2luKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJpc2UobiA9IGxlbmd0aChiX2FyZWEpKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwbHlyOjpmaWx0ZXIob3JpZ2luID09ICJtMiIpICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChuKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3RlcigpKQ0KICAgICAgICAgICApICsNCiAgYW5ub3RhdGUoInRleHQiLA0KICAgICAgICAgICB4ID0gMS42LCANCiAgICAgICAgICAgeSA9IDEsIA0KICAgICAgICAgICBsYWJlbCA9IHBhc3RlKCJuID0gIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgVEVSTUlOQUxTICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBfYnkob3JpZ2luKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJpc2UobiA9IGxlbmd0aChiX2FyZWEpKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwbHlyOjpmaWx0ZXIob3JpZ2luID09ICJ1bmtub3duIikgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KG4pICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuY2hhcmFjdGVyKCkpDQogICkNCmBgYA0KDQo=